diff --git a/PerfectNumbers.Core/ULongExtensions.cs b/PerfectNumbers.Core/ULongExtensions.cs index 9cfac7e..1c63b51 100644 --- a/PerfectNumbers.Core/ULongExtensions.cs +++ b/PerfectNumbers.Core/ULongExtensions.cs @@ -142,679 +142,279 @@ public static class ULongExtensions public ulong Element126; public ulong Element127; - public ulong this[int index] + public ref ulong this[int index] { - readonly get + get { - return GetElement(index); - } - - set - { - SetElement(index, value); + return ref GetElementRef(index); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private readonly ulong GetElement(int index) + private ref ulong GetElementRef(int index) { switch (index) { - case 0: - return Element0; - case 1: - return Element1; - case 2: - return Element2; - case 3: - return Element3; - case 4: - return Element4; - case 5: - return Element5; - case 6: - return Element6; - case 7: - return Element7; - case 8: - return Element8; - case 9: - return Element9; - case 10: - return Element10; - case 11: - return Element11; - case 12: - return Element12; - case 13: - return Element13; - case 14: - return Element14; - case 15: - return Element15; - case 16: - return Element16; - case 17: - return Element17; - case 18: - return Element18; - case 19: - return Element19; - case 20: - return Element20; - case 21: - return Element21; - case 22: - return Element22; - case 23: - return Element23; - case 24: - return Element24; - case 25: - return Element25; - case 26: - return Element26; - case 27: - return Element27; - case 28: - return Element28; - case 29: - return Element29; - case 30: - return Element30; - case 31: - return Element31; - case 32: - return Element32; - case 33: - return Element33; - case 34: - return Element34; - case 35: - return Element35; - case 36: - return Element36; - case 37: - return Element37; - case 38: - return Element38; - case 39: - return Element39; - case 40: - return Element40; - case 41: - return Element41; - case 42: - return Element42; - case 43: - return Element43; - case 44: - return Element44; - case 45: - return Element45; - case 46: - return Element46; - case 47: - return Element47; - case 48: - return Element48; - case 49: - return Element49; - case 50: - return Element50; - case 51: - return Element51; - case 52: - return Element52; - case 53: - return Element53; - case 54: - return Element54; - case 55: - return Element55; - case 56: - return Element56; - case 57: - return Element57; - case 58: - return Element58; - case 59: - return Element59; - case 60: - return Element60; - case 61: - return Element61; - case 62: - return Element62; - case 63: - return Element63; - case 64: - return Element64; - case 65: - return Element65; - case 66: - return Element66; - case 67: - return Element67; - case 68: - return Element68; - case 69: - return Element69; - case 70: - return Element70; - case 71: - return Element71; - case 72: - return Element72; - case 73: - return Element73; - case 74: - return Element74; - case 75: - return Element75; - case 76: - return Element76; - case 77: - return Element77; - case 78: - return Element78; - case 79: - return Element79; - case 80: - return Element80; - case 81: - return Element81; - case 82: - return Element82; - case 83: - return Element83; - case 84: - return Element84; - case 85: - return Element85; - case 86: - return Element86; - case 87: - return Element87; - case 88: - return Element88; - case 89: - return Element89; - case 90: - return Element90; - case 91: - return Element91; - case 92: - return Element92; - case 93: - return Element93; - case 94: - return Element94; - case 95: - return Element95; - case 96: - return Element96; - case 97: - return Element97; - case 98: - return Element98; - case 99: - return Element99; - case 100: - return Element100; - case 101: - return Element101; - case 102: - return Element102; - case 103: - return Element103; - case 104: - return Element104; - case 105: - return Element105; - case 106: - return Element106; - case 107: - return Element107; - case 108: - return Element108; - case 109: - return Element109; - case 110: - return Element110; - case 111: - return Element111; - case 112: - return Element112; - case 113: - return Element113; - case 114: - return Element114; - case 115: - return Element115; - case 116: - return Element116; - case 117: - return Element117; - case 118: - return Element118; - case 119: - return Element119; - case 120: - return Element120; - case 121: - return Element121; - case 122: - return Element122; - case 123: - return Element123; - case 124: - return Element124; - case 125: - return Element125; - case 126: - return Element126; - case 127: - return Element127; - default: - throw new ArgumentOutOfRangeException(nameof(index), index, "Pow2OddPowerTable index must be between 0 and 127."); + case 0: + return ref Element0; + case 1: + return ref Element1; + case 2: + return ref Element2; + case 3: + return ref Element3; + case 4: + return ref Element4; + case 5: + return ref Element5; + case 6: + return ref Element6; + case 7: + return ref Element7; + case 8: + return ref Element8; + case 9: + return ref Element9; + case 10: + return ref Element10; + case 11: + return ref Element11; + case 12: + return ref Element12; + case 13: + return ref Element13; + case 14: + return ref Element14; + case 15: + return ref Element15; + case 16: + return ref Element16; + case 17: + return ref Element17; + case 18: + return ref Element18; + case 19: + return ref Element19; + case 20: + return ref Element20; + case 21: + return ref Element21; + case 22: + return ref Element22; + case 23: + return ref Element23; + case 24: + return ref Element24; + case 25: + return ref Element25; + case 26: + return ref Element26; + case 27: + return ref Element27; + case 28: + return ref Element28; + case 29: + return ref Element29; + case 30: + return ref Element30; + case 31: + return ref Element31; + case 32: + return ref Element32; + case 33: + return ref Element33; + case 34: + return ref Element34; + case 35: + return ref Element35; + case 36: + return ref Element36; + case 37: + return ref Element37; + case 38: + return ref Element38; + case 39: + return ref Element39; + case 40: + return ref Element40; + case 41: + return ref Element41; + case 42: + return ref Element42; + case 43: + return ref Element43; + case 44: + return ref Element44; + case 45: + return ref Element45; + case 46: + return ref Element46; + case 47: + return ref Element47; + case 48: + return ref Element48; + case 49: + return ref Element49; + case 50: + return ref Element50; + case 51: + return ref Element51; + case 52: + return ref Element52; + case 53: + return ref Element53; + case 54: + return ref Element54; + case 55: + return ref Element55; + case 56: + return ref Element56; + case 57: + return ref Element57; + case 58: + return ref Element58; + case 59: + return ref Element59; + case 60: + return ref Element60; + case 61: + return ref Element61; + case 62: + return ref Element62; + case 63: + return ref Element63; + case 64: + return ref Element64; + case 65: + return ref Element65; + case 66: + return ref Element66; + case 67: + return ref Element67; + case 68: + return ref Element68; + case 69: + return ref Element69; + case 70: + return ref Element70; + case 71: + return ref Element71; + case 72: + return ref Element72; + case 73: + return ref Element73; + case 74: + return ref Element74; + case 75: + return ref Element75; + case 76: + return ref Element76; + case 77: + return ref Element77; + case 78: + return ref Element78; + case 79: + return ref Element79; + case 80: + return ref Element80; + case 81: + return ref Element81; + case 82: + return ref Element82; + case 83: + return ref Element83; + case 84: + return ref Element84; + case 85: + return ref Element85; + case 86: + return ref Element86; + case 87: + return ref Element87; + case 88: + return ref Element88; + case 89: + return ref Element89; + case 90: + return ref Element90; + case 91: + return ref Element91; + case 92: + return ref Element92; + case 93: + return ref Element93; + case 94: + return ref Element94; + case 95: + return ref Element95; + case 96: + return ref Element96; + case 97: + return ref Element97; + case 98: + return ref Element98; + case 99: + return ref Element99; + case 100: + return ref Element100; + case 101: + return ref Element101; + case 102: + return ref Element102; + case 103: + return ref Element103; + case 104: + return ref Element104; + case 105: + return ref Element105; + case 106: + return ref Element106; + case 107: + return ref Element107; + case 108: + return ref Element108; + case 109: + return ref Element109; + case 110: + return ref Element110; + case 111: + return ref Element111; + case 112: + return ref Element112; + case 113: + return ref Element113; + case 114: + return ref Element114; + case 115: + return ref Element115; + case 116: + return ref Element116; + case 117: + return ref Element117; + case 118: + return ref Element118; + case 119: + return ref Element119; + case 120: + return ref Element120; + case 121: + return ref Element121; + case 122: + return ref Element122; + case 123: + return ref Element123; + case 124: + return ref Element124; + case 125: + return ref Element125; + case 126: + return ref Element126; + case 127: + return ref Element127; + default: + return ref Element0; } } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void SetElement(int index, ulong value) - { - switch (index) - { - case 0: - Element0 = value; - return; - case 1: - Element1 = value; - return; - case 2: - Element2 = value; - return; - case 3: - Element3 = value; - return; - case 4: - Element4 = value; - return; - case 5: - Element5 = value; - return; - case 6: - Element6 = value; - return; - case 7: - Element7 = value; - return; - case 8: - Element8 = value; - return; - case 9: - Element9 = value; - return; - case 10: - Element10 = value; - return; - case 11: - Element11 = value; - return; - case 12: - Element12 = value; - return; - case 13: - Element13 = value; - return; - case 14: - Element14 = value; - return; - case 15: - Element15 = value; - return; - case 16: - Element16 = value; - return; - case 17: - Element17 = value; - return; - case 18: - Element18 = value; - return; - case 19: - Element19 = value; - return; - case 20: - Element20 = value; - return; - case 21: - Element21 = value; - return; - case 22: - Element22 = value; - return; - case 23: - Element23 = value; - return; - case 24: - Element24 = value; - return; - case 25: - Element25 = value; - return; - case 26: - Element26 = value; - return; - case 27: - Element27 = value; - return; - case 28: - Element28 = value; - return; - case 29: - Element29 = value; - return; - case 30: - Element30 = value; - return; - case 31: - Element31 = value; - return; - case 32: - Element32 = value; - return; - case 33: - Element33 = value; - return; - case 34: - Element34 = value; - return; - case 35: - Element35 = value; - return; - case 36: - Element36 = value; - return; - case 37: - Element37 = value; - return; - case 38: - Element38 = value; - return; - case 39: - Element39 = value; - return; - case 40: - Element40 = value; - return; - case 41: - Element41 = value; - return; - case 42: - Element42 = value; - return; - case 43: - Element43 = value; - return; - case 44: - Element44 = value; - return; - case 45: - Element45 = value; - return; - case 46: - Element46 = value; - return; - case 47: - Element47 = value; - return; - case 48: - Element48 = value; - return; - case 49: - Element49 = value; - return; - case 50: - Element50 = value; - return; - case 51: - Element51 = value; - return; - case 52: - Element52 = value; - return; - case 53: - Element53 = value; - return; - case 54: - Element54 = value; - return; - case 55: - Element55 = value; - return; - case 56: - Element56 = value; - return; - case 57: - Element57 = value; - return; - case 58: - Element58 = value; - return; - case 59: - Element59 = value; - return; - case 60: - Element60 = value; - return; - case 61: - Element61 = value; - return; - case 62: - Element62 = value; - return; - case 63: - Element63 = value; - return; - case 64: - Element64 = value; - return; - case 65: - Element65 = value; - return; - case 66: - Element66 = value; - return; - case 67: - Element67 = value; - return; - case 68: - Element68 = value; - return; - case 69: - Element69 = value; - return; - case 70: - Element70 = value; - return; - case 71: - Element71 = value; - return; - case 72: - Element72 = value; - return; - case 73: - Element73 = value; - return; - case 74: - Element74 = value; - return; - case 75: - Element75 = value; - return; - case 76: - Element76 = value; - return; - case 77: - Element77 = value; - return; - case 78: - Element78 = value; - return; - case 79: - Element79 = value; - return; - case 80: - Element80 = value; - return; - case 81: - Element81 = value; - return; - case 82: - Element82 = value; - return; - case 83: - Element83 = value; - return; - case 84: - Element84 = value; - return; - case 85: - Element85 = value; - return; - case 86: - Element86 = value; - return; - case 87: - Element87 = value; - return; - case 88: - Element88 = value; - return; - case 89: - Element89 = value; - return; - case 90: - Element90 = value; - return; - case 91: - Element91 = value; - return; - case 92: - Element92 = value; - return; - case 93: - Element93 = value; - return; - case 94: - Element94 = value; - return; - case 95: - Element95 = value; - return; - case 96: - Element96 = value; - return; - case 97: - Element97 = value; - return; - case 98: - Element98 = value; - return; - case 99: - Element99 = value; - return; - case 100: - Element100 = value; - return; - case 101: - Element101 = value; - return; - case 102: - Element102 = value; - return; - case 103: - Element103 = value; - return; - case 104: - Element104 = value; - return; - case 105: - Element105 = value; - return; - case 106: - Element106 = value; - return; - case 107: - Element107 = value; - return; - case 108: - Element108 = value; - return; - case 109: - Element109 = value; - return; - case 110: - Element110 = value; - return; - case 111: - Element111 = value; - return; - case 112: - Element112 = value; - return; - case 113: - Element113 = value; - return; - case 114: - Element114 = value; - return; - case 115: - Element115 = value; - return; - case 116: - Element116 = value; - return; - case 117: - Element117 = value; - return; - case 118: - Element118 = value; - return; - case 119: - Element119 = value; - return; - case 120: - Element120 = value; - return; - case 121: - Element121 = value; - return; - case 122: - Element122 = value; - return; - case 123: - Element123 = value; - return; - case 124: - Element124 = value; - return; - case 125: - Element125 = value; - return; - case 126: - Element126 = value; - return; - case 127: - Element127 = value; - return; - default: - throw new ArgumentOutOfRangeException(nameof(index), index, "Pow2OddPowerTable index must be between 0 and 127."); - } - } - } public static ulong CalculateOrder(this ulong q)