<PackageReference Include="SSH.NET" Version="2024.1.0" />

LongArray

class LongArray
using Renci.SshNet.Security.Org.BouncyCastle.Utilities; using System; using System.Text; namespace Renci.SshNet.Security.Org.BouncyCastle.Math.EC { internal class LongArray { private static readonly ushort[] INTERLEAVE2_TABLE = new ushort[256] { 0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85, 256, 257, 260, 261, 272, 273, 276, 277, 320, 321, 324, 325, 336, 337, 340, 341, 1024, 1025, 1028, 1029, 1040, 1041, 1044, 1045, 1088, 1089, 1092, 1093, 1104, 1105, 1108, 1109, 1280, 1281, 1284, 1285, 1296, 1297, 1300, 1301, 1344, 1345, 1348, 1349, 1360, 1361, 1364, 1365, 4096, 4097, 4100, 4101, 4112, 4113, 4116, 4117, 4160, 4161, 4164, 4165, 4176, 4177, 4180, 4181, 4352, 4353, 4356, 4357, 4368, 4369, 4372, 4373, 4416, 4417, 4420, 4421, 4432, 4433, 4436, 4437, 5120, 5121, 5124, 5125, 5136, 5137, 5140, 5141, 5184, 5185, 5188, 5189, 5200, 5201, 5204, 5205, 5376, 5377, 5380, 5381, 5392, 5393, 5396, 5397, 5440, 5441, 5444, 5445, 5456, 5457, 5460, 5461, 16384, 16385, 16388, 16389, 16400, 16401, 16404, 16405, 16448, 16449, 16452, 16453, 16464, 16465, 16468, 16469, 16640, 16641, 16644, 16645, 16656, 16657, 16660, 16661, 16704, 16705, 16708, 16709, 16720, 16721, 16724, 16725, 17408, 17409, 17412, 17413, 17424, 17425, 17428, 17429, 17472, 17473, 17476, 17477, 17488, 17489, 17492, 17493, 17664, 17665, 17668, 17669, 17680, 17681, 17684, 17685, 17728, 17729, 17732, 17733, 17744, 17745, 17748, 17749, 20480, 20481, 20484, 20485, 20496, 20497, 20500, 20501, 20544, 20545, 20548, 20549, 20560, 20561, 20564, 20565, 20736, 20737, 20740, 20741, 20752, 20753, 20756, 20757, 20800, 20801, 20804, 20805, 20816, 20817, 20820, 20821, 21504, 21505, 21508, 21509, 21520, 21521, 21524, 21525, 21568, 21569, 21572, 21573, 21584, 21585, 21588, 21589, 21760, 21761, 21764, 21765, 21776, 21777, 21780, 21781, 21824, 21825, 21828, 21829, 21840, 21841, 21844, 21845 }; private static readonly int[] INTERLEAVE3_TABLE = new int[128] { 0, 1, 8, 9, 64, 65, 72, 73, 512, 513, 520, 521, 576, 577, 584, 585, 4096, 4097, 4104, 4105, 4160, 4161, 4168, 4169, 4608, 4609, 4616, 4617, 4672, 4673, 4680, 4681, 32768, 32769, 32776, 32777, 32832, 32833, 32840, 32841, 33280, 33281, 33288, 33289, 33344, 33345, 33352, 33353, 36864, 36865, 36872, 36873, 36928, 36929, 36936, 36937, 37376, 37377, 37384, 37385, 37440, 37441, 37448, 37449, 262144, 262145, 262152, 262153, 262208, 262209, 262216, 262217, 262656, 262657, 262664, 262665, 262720, 262721, 262728, 262729, 266240, 266241, 266248, 266249, 266304, 266305, 266312, 266313, 266752, 266753, 266760, 266761, 266816, 266817, 266824, 266825, 294912, 294913, 294920, 294921, 294976, 294977, 294984, 294985, 295424, 295425, 295432, 295433, 295488, 295489, 295496, 295497, 299008, 299009, 299016, 299017, 299072, 299073, 299080, 299081, 299520, 299521, 299528, 299529, 299584, 299585, 299592, 299593 }; private static readonly int[] INTERLEAVE4_TABLE = new int[256] { 0, 1, 16, 17, 256, 257, 272, 273, 4096, 4097, 4112, 4113, 4352, 4353, 4368, 4369, 65536, 65537, 65552, 65553, 65792, 65793, 65808, 65809, 69632, 69633, 69648, 69649, 69888, 69889, 69904, 69905, 1048576, 1048577, 1048592, 1048593, 1048832, 1048833, 1048848, 1048849, 1052672, 1052673, 1052688, 1052689, 1052928, 1052929, 1052944, 1052945, 1114112, 1114113, 1114128, 1114129, 1114368, 1114369, 1114384, 1114385, 1118208, 1118209, 1118224, 1118225, 1118464, 1118465, 1118480, 1118481, 16777216, 16777217, 16777232, 16777233, 16777472, 16777473, 16777488, 16777489, 16781312, 16781313, 16781328, 16781329, 16781568, 16781569, 16781584, 16781585, 16842752, 16842753, 16842768, 16842769, 16843008, 16843009, 16843024, 16843025, 16846848, 16846849, 16846864, 16846865, 16847104, 16847105, 16847120, 16847121, 17825792, 17825793, 17825808, 17825809, 17826048, 17826049, 17826064, 17826065, 17829888, 17829889, 17829904, 17829905, 17830144, 17830145, 17830160, 17830161, 17891328, 17891329, 17891344, 17891345, 17891584, 17891585, 17891600, 17891601, 17895424, 17895425, 17895440, 17895441, 17895680, 17895681, 17895696, 17895697, 268435456, 268435457, 268435472, 268435473, 268435712, 268435713, 268435728, 268435729, 268439552, 268439553, 268439568, 268439569, 268439808, 268439809, 268439824, 268439825, 268500992, 268500993, 268501008, 268501009, 268501248, 268501249, 268501264, 268501265, 268505088, 268505089, 268505104, 268505105, 268505344, 268505345, 268505360, 268505361, 269484032, 269484033, 269484048, 269484049, 269484288, 269484289, 269484304, 269484305, 269488128, 269488129, 269488144, 269488145, 269488384, 269488385, 269488400, 269488401, 269549568, 269549569, 269549584, 269549585, 269549824, 269549825, 269549840, 269549841, 269553664, 269553665, 269553680, 269553681, 269553920, 269553921, 269553936, 269553937, 285212672, 285212673, 285212688, 285212689, 285212928, 285212929, 285212944, 285212945, 285216768, 285216769, 285216784, 285216785, 285217024, 285217025, 285217040, 285217041, 285278208, 285278209, 285278224, 285278225, 285278464, 285278465, 285278480, 285278481, 285282304, 285282305, 285282320, 285282321, 285282560, 285282561, 285282576, 285282577, 286261248, 286261249, 286261264, 286261265, 286261504, 286261505, 286261520, 286261521, 286265344, 286265345, 286265360, 286265361, 286265600, 286265601, 286265616, 286265617, 286326784, 286326785, 286326800, 286326801, 286327040, 286327041, 286327056, 286327057, 286330880, 286330881, 286330896, 286330897, 286331136, 286331137, 286331152, 286331153 }; private static readonly int[] INTERLEAVE5_TABLE = new int[128] { 0, 1, 32, 33, 1024, 1025, 1056, 1057, 32768, 32769, 32800, 32801, 33792, 33793, 33824, 33825, 1048576, 1048577, 1048608, 1048609, 1049600, 1049601, 1049632, 1049633, 1081344, 1081345, 1081376, 1081377, 1082368, 1082369, 1082400, 1082401, 33554432, 33554433, 33554464, 33554465, 33555456, 33555457, 33555488, 33555489, 33587200, 33587201, 33587232, 33587233, 33588224, 33588225, 33588256, 33588257, 34603008, 34603009, 34603040, 34603041, 34604032, 34604033, 34604064, 34604065, 34635776, 34635777, 34635808, 34635809, 34636800, 34636801, 34636832, 34636833, 1073741824, 1073741825, 1073741856, 1073741857, 1073742848, 1073742849, 1073742880, 1073742881, 1073774592, 1073774593, 1073774624, 1073774625, 1073775616, 1073775617, 1073775648, 1073775649, 1074790400, 1074790401, 1074790432, 1074790433, 1074791424, 1074791425, 1074791456, 1074791457, 1074823168, 1074823169, 1074823200, 1074823201, 1074824192, 1074824193, 1074824224, 1074824225, 1107296256, 1107296257, 1107296288, 1107296289, 1107297280, 1107297281, 1107297312, 1107297313, 1107329024, 1107329025, 1107329056, 1107329057, 1107330048, 1107330049, 1107330080, 1107330081, 1108344832, 1108344833, 1108344864, 1108344865, 1108345856, 1108345857, 1108345888, 1108345889, 1108377600, 1108377601, 1108377632, 1108377633, 1108378624, 1108378625, 1108378656, 1108378657 }; private static readonly long[] INTERLEAVE7_TABLE = new long[512] { 0, 1, 128, 129, 16384, 16385, 16512, 16513, 2097152, 2097153, 2097280, 2097281, 2113536, 2113537, 2113664, 2113665, 268435456, 268435457, 268435584, 268435585, 268451840, 268451841, 268451968, 268451969, 270532608, 270532609, 270532736, 270532737, 270548992, 270548993, 270549120, 270549121, 34359738368, 34359738369, 34359738496, 34359738497, 34359754752, 34359754753, 34359754880, 34359754881, 34361835520, 34361835521, 34361835648, 34361835649, 34361851904, 34361851905, 34361852032, 34361852033, 34628173824, 34628173825, 34628173952, 34628173953, 34628190208, 34628190209, 34628190336, 34628190337, 34630270976, 34630270977, 34630271104, 34630271105, 34630287360, 34630287361, 34630287488, 34630287489, 4398046511104, 4398046511105, 4398046511232, 4398046511233, 4398046527488, 4398046527489, 4398046527616, 4398046527617, 4398048608256, 4398048608257, 4398048608384, 4398048608385, 4398048624640, 4398048624641, 4398048624768, 4398048624769, 4398314946560, 4398314946561, 4398314946688, 4398314946689, 4398314962944, 4398314962945, 4398314963072, 4398314963073, 4398317043712, 4398317043713, 4398317043840, 4398317043841, 4398317060096, 4398317060097, 4398317060224, 4398317060225, 4432406249472, 4432406249473, 4432406249600, 4432406249601, 4432406265856, 4432406265857, 4432406265984, 4432406265985, 4432408346624, 4432408346625, 4432408346752, 4432408346753, 4432408363008, 4432408363009, 4432408363136, 4432408363137, 4432674684928, 4432674684929, 4432674685056, 4432674685057, 4432674701312, 4432674701313, 4432674701440, 4432674701441, 4432676782080, 4432676782081, 4432676782208, 4432676782209, 4432676798464, 4432676798465, 4432676798592, 4432676798593, 562949953421312, 562949953421313, 562949953421440, 562949953421441, 562949953437696, 562949953437697, 562949953437824, 562949953437825, 562949955518464, 562949955518465, 562949955518592, 562949955518593, 562949955534848, 562949955534849, 562949955534976, 562949955534977, 562950221856768, 562950221856769, 562950221856896, 562950221856897, 562950221873152, 562950221873153, 562950221873280, 562950221873281, 562950223953920, 562950223953921, 562950223954048, 562950223954049, 562950223970304, 562950223970305, 562950223970432, 562950223970433, 562984313159680, 562984313159681, 562984313159808, 562984313159809, 562984313176064, 562984313176065, 562984313176192, 562984313176193, 562984315256832, 562984315256833, 562984315256960, 562984315256961, 562984315273216, 562984315273217, 562984315273344, 562984315273345, 562984581595136, 562984581595137, 562984581595264, 562984581595265, 562984581611520, 562984581611521, 562984581611648, 562984581611649, 562984583692288, 562984583692289, 562984583692416, 562984583692417, 562984583708672, 562984583708673, 562984583708800, 562984583708801, 567347999932416, 567347999932417, 567347999932544, 567347999932545, 567347999948800, 567347999948801, 567347999948928, 567347999948929, 567348002029568, 567348002029569, 567348002029696, 567348002029697, 567348002045952, 567348002045953, 567348002046080, 567348002046081, 567348268367872, 567348268367873, 567348268368000, 567348268368001, 567348268384256, 567348268384257, 567348268384384, 567348268384385, 567348270465024, 567348270465025, 567348270465152, 567348270465153, 567348270481408, 567348270481409, 567348270481536, 567348270481537, 567382359670784, 567382359670785, 567382359670912, 567382359670913, 567382359687168, 567382359687169, 567382359687296, 567382359687297, 567382361767936, 567382361767937, 567382361768064, 567382361768065, 567382361784320, 567382361784321, 567382361784448, 567382361784449, 567382628106240, 567382628106241, 567382628106368, 567382628106369, 567382628122624, 567382628122625, 567382628122752, 567382628122753, 567382630203392, 567382630203393, 567382630203520, 567382630203521, 567382630219776, 567382630219777, 567382630219904, 567382630219905, 72057594037927936, 72057594037927937, 72057594037928064, 72057594037928065, 72057594037944320, 72057594037944321, 72057594037944448, 72057594037944449, 72057594040025088, 72057594040025089, 72057594040025216, 72057594040025217, 72057594040041472, 72057594040041473, 72057594040041600, 72057594040041601, 72057594306363392, 72057594306363393, 72057594306363520, 72057594306363521, 72057594306379776, 72057594306379777, 72057594306379904, 72057594306379905, 72057594308460544, 72057594308460545, 72057594308460672, 72057594308460673, 72057594308476928, 72057594308476929, 72057594308477056, 72057594308477057, 72057628397666304, 72057628397666305, 72057628397666432, 72057628397666433, 72057628397682688, 72057628397682689, 72057628397682816, 72057628397682817, 72057628399763456, 72057628399763457, 72057628399763584, 72057628399763585, 72057628399779840, 72057628399779841, 72057628399779968, 72057628399779969, 72057628666101760, 72057628666101761, 72057628666101888, 72057628666101889, 72057628666118144, 72057628666118145, 72057628666118272, 72057628666118273, 72057628668198912, 72057628668198913, 72057628668199040, 72057628668199041, 72057628668215296, 72057628668215297, 72057628668215424, 72057628668215425, 72061992084439040, 72061992084439041, 72061992084439168, 72061992084439169, 72061992084455424, 72061992084455425, 72061992084455552, 72061992084455553, 72061992086536192, 72061992086536193, 72061992086536320, 72061992086536321, 72061992086552576, 72061992086552577, 72061992086552704, 72061992086552705, 72061992352874496, 72061992352874497, 72061992352874624, 72061992352874625, 72061992352890880, 72061992352890881, 72061992352891008, 72061992352891009, 72061992354971648, 72061992354971649, 72061992354971776, 72061992354971777, 72061992354988032, 72061992354988033, 72061992354988160, 72061992354988161, 72062026444177408, 72062026444177409, 72062026444177536, 72062026444177537, 72062026444193792, 72062026444193793, 72062026444193920, 72062026444193921, 72062026446274560, 72062026446274561, 72062026446274688, 72062026446274689, 72062026446290944, 72062026446290945, 72062026446291072, 72062026446291073, 72062026712612864, 72062026712612865, 72062026712612992, 72062026712612993, 72062026712629248, 72062026712629249, 72062026712629376, 72062026712629377, 72062026714710016, 72062026714710017, 72062026714710144, 72062026714710145, 72062026714726400, 72062026714726401, 72062026714726528, 72062026714726529, 72620543991349248, 72620543991349249, 72620543991349376, 72620543991349377, 72620543991365632, 72620543991365633, 72620543991365760, 72620543991365761, 72620543993446400, 72620543993446401, 72620543993446528, 72620543993446529, 72620543993462784, 72620543993462785, 72620543993462912, 72620543993462913, 72620544259784704, 72620544259784705, 72620544259784832, 72620544259784833, 72620544259801088, 72620544259801089, 72620544259801216, 72620544259801217, 72620544261881856, 72620544261881857, 72620544261881984, 72620544261881985, 72620544261898240, 72620544261898241, 72620544261898368, 72620544261898369, 72620578351087616, 72620578351087617, 72620578351087744, 72620578351087745, 72620578351104000, 72620578351104001, 72620578351104128, 72620578351104129, 72620578353184768, 72620578353184769, 72620578353184896, 72620578353184897, 72620578353201152, 72620578353201153, 72620578353201280, 72620578353201281, 72620578619523072, 72620578619523073, 72620578619523200, 72620578619523201, 72620578619539456, 72620578619539457, 72620578619539584, 72620578619539585, 72620578621620224, 72620578621620225, 72620578621620352, 72620578621620353, 72620578621636608, 72620578621636609, 72620578621636736, 72620578621636737, 72624942037860352, 72624942037860353, 72624942037860480, 72624942037860481, 72624942037876736, 72624942037876737, 72624942037876864, 72624942037876865, 72624942039957504, 72624942039957505, 72624942039957632, 72624942039957633, 72624942039973888, 72624942039973889, 72624942039974016, 72624942039974017, 72624942306295808, 72624942306295809, 72624942306295936, 72624942306295937, 72624942306312192, 72624942306312193, 72624942306312320, 72624942306312321, 72624942308392960, 72624942308392961, 72624942308393088, 72624942308393089, 72624942308409344, 72624942308409345, 72624942308409472, 72624942308409473, 72624976397598720, 72624976397598721, 72624976397598848, 72624976397598849, 72624976397615104, 72624976397615105, 72624976397615232, 72624976397615233, 72624976399695872, 72624976399695873, 72624976399696000, 72624976399696001, 72624976399712256, 72624976399712257, 72624976399712384, 72624976399712385, 72624976666034176, 72624976666034177, 72624976666034304, 72624976666034305, 72624976666050560, 72624976666050561, 72624976666050688, 72624976666050689, 72624976668131328, 72624976668131329, 72624976668131456, 72624976668131457, 72624976668147712, 72624976668147713, 72624976668147840, 72624976668147841 }; private const string ZEROES = "0000000000000000000000000000000000000000000000000000000000000000"; internal static readonly byte[] BitLengths = new byte[256] { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; private long[] m_ints; public int Length => m_ints.Length; public LongArray(int intLen) { m_ints = new long[intLen]; } public LongArray(long[] ints) { m_ints = ints; } public LongArray(long[] ints, int off, int len) { if (off == 0 && len == ints.Length) m_ints = ints; else { m_ints = new long[len]; Array.Copy(ints, off, m_ints, 0, len); } } public LongArray(BigInteger bigInt) { if (bigInt == null || bigInt.SignValue < 0) throw new ArgumentException("invalid F2m field value", "bigInt"); if (bigInt.SignValue == 0) m_ints = new long[1]; else { byte[] array = bigInt.ToByteArray(); int num = array.Length; int num2 = 0; if (array[0] == 0) { num--; num2 = 1; } int num3 = (num + 7) / 8; m_ints = new long[num3]; int num4 = num3 - 1; int num5 = num % 8 + num2; long num6 = 0; int i = num2; if (num2 < num5) { for (; i < num5; i++) { num6 <<= 8; uint num7 = array[i]; num6 |= num7; } m_ints[num4--] = num6; } while (num4 >= 0) { num6 = 0; for (int j = 0; j < 8; j++) { num6 <<= 8; uint num10 = array[i++]; num6 |= num10; } m_ints[num4] = num6; num4--; } } } internal void CopyTo(long[] z, int zOff) { Array.Copy(m_ints, 0, z, zOff, m_ints.Length); } public bool IsOne() { long[] ints = m_ints; if (ints[0] != 1) return false; for (int i = 1; i < ints.Length; i++) { if (ints[i] != 0) return false; } return true; } public bool IsZero() { long[] ints = m_ints; for (int i = 0; i < ints.Length; i++) { if (ints[i] != 0) return false; } return true; } public int GetUsedLength() { return GetUsedLengthFrom(m_ints.Length); } public int GetUsedLengthFrom(int from) { long[] ints = m_ints; from = System.Math.Min(from, ints.Length); if (from < 1) return 0; if (ints[0] != 0) { while (ints[--from] == 0) { } return from + 1; } do { if (ints[--from] != 0) return from + 1; } while (from > 0); return 0; } public int Degree() { int num = m_ints.Length; long num2; do { if (num == 0) return 0; num2 = m_ints[--num]; } while (num2 == 0); return (num << 6) + BitLength(num2); } private int DegreeFrom(int limit) { int num = (int)((uint)(limit + 62) >> 6); long num2; do { if (num == 0) return 0; num2 = m_ints[--num]; } while (num2 == 0); return (num << 6) + BitLength(num2); } private static int BitLength(long w) { int num = (int)((ulong)w >> 32); int num2; if (num == 0) { num = (int)w; num2 = 0; } else num2 = 32; int num3 = (int)((uint)num >> 16); int num4; if (num3 == 0) { num3 = (int)((uint)num >> 8); num4 = ((num3 == 0) ? BitLengths[num] : (8 + BitLengths[num3])); } else { int num5 = (int)((uint)num3 >> 8); num4 = ((num5 == 0) ? (16 + BitLengths[num3]) : (24 + BitLengths[num5])); } return num2 + num4; } private long[] ResizedInts(int newLen) { long[] array = new long[newLen]; Array.Copy(m_ints, 0, array, 0, System.Math.Min(m_ints.Length, newLen)); return array; } public BigInteger ToBigInteger() { int usedLength = GetUsedLength(); if (usedLength == 0) return BigInteger.Zero; long num = m_ints[usedLength - 1]; byte[] array = new byte[8]; int num2 = 0; bool flag = false; for (int num3 = 7; num3 >= 0; num3--) { byte b = (byte)((ulong)num >> 8 * num3); if (flag || b != 0) { flag = true; array[num2++] = b; } } byte[] array2 = new byte[8 * (usedLength - 1) + num2]; for (int i = 0; i < num2; i++) { array2[i] = array[i]; } for (int num5 = usedLength - 2; num5 >= 0; num5--) { long num6 = m_ints[num5]; for (int num7 = 7; num7 >= 0; num7--) { array2[num2++] = (byte)((ulong)num6 >> 8 * num7); } } return new BigInteger(1, array2); } private static long ShiftUp(long[] x, int xOff, int count, int shift) { int num = 64 - shift; long num2 = 0; for (int i = 0; i < count; i++) { long num3 = x[xOff + i]; x[xOff + i] = ((num3 << shift) | num2); num2 = (long)((ulong)num3 >> num); } return num2; } private static long ShiftUp(long[] x, int xOff, long[] z, int zOff, int count, int shift) { int num = 64 - shift; long num2 = 0; for (int i = 0; i < count; i++) { long num3 = x[xOff + i]; z[zOff + i] = ((num3 << shift) | num2); num2 = (long)((ulong)num3 >> num); } return num2; } public LongArray AddOne() { if (m_ints.Length == 0) return new LongArray(new long[1] { 1 }); int newLen = System.Math.Max(1, GetUsedLength()); long[] array = ResizedInts(newLen); array[0] ^= 1; return new LongArray(array); } private void AddShiftedByBitsSafe(LongArray other, int otherDegree, int bits) { int num = (int)((uint)(otherDegree + 63) >> 6); int num2 = (int)((uint)bits >> 6); int num3 = bits & 63; if (num3 == 0) Add(m_ints, num2, other.m_ints, 0, num); else { long num4 = AddShiftedUp(m_ints, num2, other.m_ints, 0, num, num3); if (num4 != 0) m_ints[num + num2] ^= num4; } } private static long AddShiftedUp(long[] x, int xOff, long[] y, int yOff, int count, int shift) { int num = 64 - shift; long num2 = 0; for (int i = 0; i < count; i++) { long num3 = y[yOff + i]; x[xOff + i] ^= ((num3 << shift) | num2); num2 = (long)((ulong)num3 >> num); } return num2; } private static long AddShiftedDown(long[] x, int xOff, long[] y, int yOff, int count, int shift) { int num = 64 - shift; long num2 = 0; int num3 = count; while (--num3 >= 0) { long num4 = y[yOff + num3]; x[xOff + num3] ^= ((long)((ulong)num4 >> shift) | num2); num2 = num4 << num; } return num2; } public void AddShiftedByWords(LongArray other, int words) { int usedLength = other.GetUsedLength(); if (usedLength != 0) { int num = usedLength + words; if (num > m_ints.Length) m_ints = ResizedInts(num); Add(m_ints, words, other.m_ints, 0, usedLength); } } private static void Add(long[] x, int xOff, long[] y, int yOff, int count) { for (int i = 0; i < count; i++) { x[xOff + i] ^= y[yOff + i]; } } private static void Add(long[] x, int xOff, long[] y, int yOff, long[] z, int zOff, int count) { for (int i = 0; i < count; i++) { z[zOff + i] = (x[xOff + i] ^ y[yOff + i]); } } private static void AddBoth(long[] x, int xOff, long[] y1, int y1Off, long[] y2, int y2Off, int count) { for (int i = 0; i < count; i++) { x[xOff + i] ^= (y1[y1Off + i] ^ y2[y2Off + i]); } } private static void Distribute(long[] x, int src, int dst1, int dst2, int count) { for (int i = 0; i < count; i++) { long num = x[src + i]; x[dst1 + i] ^= num; x[dst2 + i] ^= num; } } private static void FlipWord(long[] buf, int off, int bit, long word) { int num = off + (int)((uint)bit >> 6); int num2 = bit & 63; if (num2 == 0) buf[num] ^= word; else { buf[num] ^= word << num2; word = (long)((ulong)word >> 64 - num2); if (word != 0) buf[++num] ^= word; } } public bool TestBitZero() { if (m_ints.Length != 0) return (m_ints[0] & 1) != 0; return false; } private static bool TestBit(long[] buf, int off, int n) { int num = (int)((uint)n >> 6); int num2 = n & 63; long num3 = 1 << num2; return (buf[off + num] & num3) != 0; } private static void FlipBit(long[] buf, int off, int n) { int num = (int)((uint)n >> 6); int num2 = n & 63; long num3 = 1 << num2; buf[off + num] ^= num3; } private static void MultiplyWord(long a, long[] b, int bLen, long[] c, int cOff) { if ((a & 1) != 0) Add(c, cOff, b, 0, bLen); int num = 1; while ((a = (long)((ulong)a >> 1)) != 0) { if ((a & 1) != 0) { long num2 = AddShiftedUp(c, cOff, b, 0, bLen, num); if (num2 != 0) c[cOff + bLen] ^= num2; } num++; } } public LongArray ModMultiplyLD(LongArray other, int m, int[] ks) { int num = Degree(); if (num == 0) return this; int num2 = other.Degree(); if (num2 == 0) return other; LongArray longArray = this; LongArray longArray2 = other; if (num > num2) { longArray = other; longArray2 = this; int num3 = num; num = num2; num2 = num3; } int num4 = (int)((uint)(num + 63) >> 6); int num5 = (int)((uint)(num2 + 63) >> 6); int num6 = (int)((uint)(num + num2 + 62) >> 6); if (num4 == 1) { long num7 = longArray.m_ints[0]; if (num7 == 1) return longArray2; long[] array = new long[num6]; MultiplyWord(num7, longArray2.m_ints, num5, array, 0); return ReduceResult(array, 0, num6, m, ks); } int num8 = (int)((uint)(num2 + 7 + 63) >> 6); int[] array2 = new int[16]; long[] array3 = new long[num8 << 4]; int num9 = array2[1] = num8; Array.Copy(longArray2.m_ints, 0, array3, num9, num5); for (int i = 2; i < 16; i++) { num9 = (array2[i] = num9 + num8); if ((i & 1) == 0) ShiftUp(array3, (int)((uint)num9 >> 1), array3, num9, num8, 1); else Add(array3, num8, array3, num9 - num8, array3, num9, num8); } long[] array4 = new long[array3.Length]; ShiftUp(array3, 0, array4, 0, array3.Length, 4); long[] ints = longArray.m_ints; long[] array5 = new long[num6]; int num10 = 15; for (int num11 = 56; num11 >= 0; num11 -= 8) { for (int j = 1; j < num4; j += 2) { int num12 = (int)((ulong)ints[j] >> num11); int num13 = num12 & num10; int num14 = (int)((uint)num12 >> 4) & num10; AddBoth(array5, j - 1, array3, array2[num13], array4, array2[num14], num8); } ShiftUp(array5, 0, num6, 8); } for (int num15 = 56; num15 >= 0; num15 -= 8) { for (int k = 0; k < num4; k += 2) { int num16 = (int)((ulong)ints[k] >> num15); int num17 = num16 & num10; int num18 = (int)((uint)num16 >> 4) & num10; AddBoth(array5, k, array3, array2[num17], array4, array2[num18], num8); } if (num15 > 0) ShiftUp(array5, 0, num6, 8); } return ReduceResult(array5, 0, num6, m, ks); } public LongArray ModMultiply(LongArray other, int m, int[] ks) { int num = Degree(); if (num == 0) return this; int num2 = other.Degree(); if (num2 == 0) return other; LongArray longArray = this; LongArray longArray2 = other; if (num > num2) { longArray = other; longArray2 = this; int num3 = num; num = num2; num2 = num3; } int num4 = (int)((uint)(num + 63) >> 6); int num5 = (int)((uint)(num2 + 63) >> 6); int num6 = (int)((uint)(num + num2 + 62) >> 6); if (num4 == 1) { long num7 = longArray.m_ints[0]; if (num7 == 1) return longArray2; long[] array = new long[num6]; MultiplyWord(num7, longArray2.m_ints, num5, array, 0); return ReduceResult(array, 0, num6, m, ks); } int num8 = (int)((uint)(num2 + 7 + 63) >> 6); int[] array2 = new int[16]; long[] array3 = new long[num8 << 4]; int num9 = array2[1] = num8; Array.Copy(longArray2.m_ints, 0, array3, num9, num5); for (int i = 2; i < 16; i++) { num9 = (array2[i] = num9 + num8); if ((i & 1) == 0) ShiftUp(array3, (int)((uint)num9 >> 1), array3, num9, num8, 1); else Add(array3, num8, array3, num9 - num8, array3, num9, num8); } long[] array4 = new long[array3.Length]; ShiftUp(array3, 0, array4, 0, array3.Length, 4); long[] ints = longArray.m_ints; long[] array5 = new long[num6 << 3]; int num10 = 15; for (int j = 0; j < num4; j++) { long num11 = ints[j]; int num12 = j; while (true) { int num13 = (int)num11 & num10; num11 = (long)((ulong)num11 >> 4); int num14 = (int)num11 & num10; AddBoth(array5, num12, array3, array2[num13], array4, array2[num14], num8); num11 = (long)((ulong)num11 >> 4); if (num11 == 0) break; num12 += num6; } } int num15 = array5.Length; while ((num15 -= num6) != 0) { AddShiftedUp(array5, num15 - num6, array5, num15, num6, 8); } return ReduceResult(array5, 0, num6, m, ks); } public LongArray ModMultiplyAlt(LongArray other, int m, int[] ks) { int num = Degree(); if (num == 0) return this; int num2 = other.Degree(); if (num2 == 0) return other; LongArray longArray = this; LongArray longArray2 = other; if (num > num2) { longArray = other; longArray2 = this; int num3 = num; num = num2; num2 = num3; } int num4 = (int)((uint)(num + 63) >> 6); int num5 = (int)((uint)(num2 + 63) >> 6); int num6 = (int)((uint)(num + num2 + 62) >> 6); if (num4 == 1) { long num7 = longArray.m_ints[0]; if (num7 == 1) return longArray2; long[] array = new long[num6]; MultiplyWord(num7, longArray2.m_ints, num5, array, 0); return ReduceResult(array, 0, num6, m, ks); } int num8 = 4; int num9 = 16; int num10 = 64; int num11 = 8; int num12 = (num10 < 64) ? num9 : (num9 - 1); int num13 = (int)((uint)(num2 + num12 + 63) >> 6); int num14 = num13 * num11; int num15 = num8 * num11; int[] array2 = new int[1 << num8]; int num16 = array2[1] = (array2[0] = num4) + num14; for (int i = 2; i < array2.Length; i++) { num16 = (array2[i] = num16 + num6); } num16 += num6; num16++; long[] array3 = new long[num16]; Interleave(longArray.m_ints, 0, array3, 0, num4, num8); int num17 = num4; Array.Copy(longArray2.m_ints, 0, array3, num17, num5); for (int j = 1; j < num11; j++) { ShiftUp(array3, num4, array3, num17 += num13, num13, j); } int num18 = (1 << num8) - 1; int num19 = 0; while (true) { int num20 = 0; do { long num21 = (long)((ulong)array3[num20] >> num19); int num22 = 0; int num23 = num4; while (true) { int num24 = (int)num21 & num18; if (num24 != 0) Add(array3, num20 + array2[num24], array3, num23, num13); if (++num22 == num11) break; num23 += num13; num21 = (long)((ulong)num21 >> num8); } } while (++num20 < num4); if ((num19 += num15) >= num10) { if (num19 >= 64) break; num19 = 64 - num8; num18 &= num18 << num10 - num19; } ShiftUp(array3, num4, num14, num11); } int num25 = array2.Length; while (--num25 > 1) { if (((long)num25 & 1) == 0) AddShiftedUp(array3, array2[(uint)num25 >> 1], array3, array2[num25], num6, num9); else Distribute(array3, array2[num25], array2[num25 - 1], array2[1], num6); } return ReduceResult(array3, array2[1], num6, m, ks); } public LongArray ModReduce(int m, int[] ks) { long[] array = Arrays.Clone(m_ints); int len = ReduceInPlace(array, 0, array.Length, m, ks); return new LongArray(array, 0, len); } public LongArray Multiply(LongArray other, int m, int[] ks) { int num = Degree(); if (num == 0) return this; int num2 = other.Degree(); if (num2 == 0) return other; LongArray longArray = this; LongArray longArray2 = other; if (num > num2) { longArray = other; longArray2 = this; int num3 = num; num = num2; num2 = num3; } int num4 = (int)((uint)(num + 63) >> 6); int num5 = (int)((uint)(num2 + 63) >> 6); int num6 = (int)((uint)(num + num2 + 62) >> 6); if (num4 == 1) { long num7 = longArray.m_ints[0]; if (num7 == 1) return longArray2; long[] array = new long[num6]; MultiplyWord(num7, longArray2.m_ints, num5, array, 0); return new LongArray(array, 0, num6); } int num8 = (int)((uint)(num2 + 7 + 63) >> 6); int[] array2 = new int[16]; long[] array3 = new long[num8 << 4]; int num9 = array2[1] = num8; Array.Copy(longArray2.m_ints, 0, array3, num9, num5); for (int i = 2; i < 16; i++) { num9 = (array2[i] = num9 + num8); if ((i & 1) == 0) ShiftUp(array3, (int)((uint)num9 >> 1), array3, num9, num8, 1); else Add(array3, num8, array3, num9 - num8, array3, num9, num8); } long[] array4 = new long[array3.Length]; ShiftUp(array3, 0, array4, 0, array3.Length, 4); long[] ints = longArray.m_ints; long[] array5 = new long[num6 << 3]; int num10 = 15; for (int j = 0; j < num4; j++) { long num11 = ints[j]; int num12 = j; while (true) { int num13 = (int)num11 & num10; num11 = (long)((ulong)num11 >> 4); int num14 = (int)num11 & num10; AddBoth(array5, num12, array3, array2[num13], array4, array2[num14], num8); num11 = (long)((ulong)num11 >> 4); if (num11 == 0) break; num12 += num6; } } int num15 = array5.Length; while ((num15 -= num6) != 0) { AddShiftedUp(array5, num15 - num6, array5, num15, num6, 8); } return new LongArray(array5, 0, num6); } public void Reduce(int m, int[] ks) { long[] ints = m_ints; int num = ReduceInPlace(ints, 0, ints.Length, m, ks); if (num < ints.Length) { m_ints = new long[num]; Array.Copy(ints, 0, m_ints, 0, num); } } private static LongArray ReduceResult(long[] buf, int off, int len, int m, int[] ks) { int len2 = ReduceInPlace(buf, off, len, m, ks); return new LongArray(buf, off, len2); } private static int ReduceInPlace(long[] buf, int off, int len, int m, int[] ks) { int num = m + 63 >> 6; if (len < num) return len; int num2 = System.Math.Min(len << 6, (m << 1) - 1); int num3; for (num3 = (len << 6) - num2; num3 >= 64; num3 -= 64) { len--; } int num4 = ks.Length; int num5 = ks[num4 - 1]; int num6 = (num4 > 1) ? ks[num4 - 2] : 0; int num7 = System.Math.Max(m, num5 + 64); int num8 = num3 + System.Math.Min(num2 - num7, m - num6) >> 6; if (num8 > 1) { int num9 = len - num8; ReduceVectorWise(buf, off, len, num9, m, ks); while (len > num9) { buf[off + --len] = 0; } num2 = num9 << 6; } if (num2 > num7) { ReduceWordWise(buf, off, len, num7, m, ks); num2 = num7; } if (num2 > m) ReduceBitWise(buf, off, num2, m, ks); return num; } private static void ReduceBitWise(long[] buf, int off, int BitLength, int m, int[] ks) { while (--BitLength >= m) { if (TestBit(buf, off, BitLength)) ReduceBit(buf, off, BitLength, m, ks); } } private static void ReduceBit(long[] buf, int off, int bit, int m, int[] ks) { FlipBit(buf, off, bit); int num = bit - m; int num2 = ks.Length; while (--num2 >= 0) { FlipBit(buf, off, ks[num2] + num); } FlipBit(buf, off, num); } private static void ReduceWordWise(long[] buf, int off, int len, int toBit, int m, int[] ks) { int num = (int)((uint)toBit >> 6); while (--len > num) { long num2 = buf[off + len]; if (num2 != 0) { buf[off + len] = 0; ReduceWord(buf, off, len << 6, num2, m, ks); } } int num3 = toBit & 63; long num4 = (long)((ulong)buf[off + num] >> num3); if (num4 != 0) { buf[off + num] ^= num4 << num3; ReduceWord(buf, off, toBit, num4, m, ks); } } private static void ReduceWord(long[] buf, int off, int bit, long word, int m, int[] ks) { int num = bit - m; int num2 = ks.Length; while (--num2 >= 0) { FlipWord(buf, off, num + ks[num2], word); } FlipWord(buf, off, num, word); } private static void ReduceVectorWise(long[] buf, int off, int len, int words, int m, int[] ks) { int num = (words << 6) - m; int num2 = ks.Length; while (--num2 >= 0) { FlipVector(buf, off, buf, off + words, len - words, num + ks[num2]); } FlipVector(buf, off, buf, off + words, len - words, num); } private static void FlipVector(long[] x, int xOff, long[] y, int yOff, int yLen, int bits) { xOff += (int)((uint)bits >> 6); bits &= 63; if (bits == 0) Add(x, xOff, y, yOff, yLen); else { long num = AddShiftedDown(x, xOff + 1, y, yOff, yLen, 64 - bits); x[xOff] ^= num; } } public LongArray ModSquare(int m, int[] ks) { int usedLength = GetUsedLength(); if (usedLength == 0) return this; int num = usedLength << 1; long[] array = new long[num]; int num2 = 0; while (num2 < num) { long num3 = m_ints[(uint)num2 >> 1]; array[num2++] = Interleave2_32to64((int)num3); array[num2++] = Interleave2_32to64((int)((ulong)num3 >> 32)); } return new LongArray(array, 0, ReduceInPlace(array, 0, array.Length, m, ks)); } public LongArray ModSquareN(int n, int m, int[] ks) { int num = GetUsedLength(); if (num == 0) return this; long[] array = new long[m + 63 >> 6 << 1]; Array.Copy(m_ints, 0, array, 0, num); while (--n >= 0) { SquareInPlace(array, num, m, ks); num = ReduceInPlace(array, 0, array.Length, m, ks); } return new LongArray(array, 0, num); } public LongArray Square(int m, int[] ks) { int usedLength = GetUsedLength(); if (usedLength == 0) return this; int num = usedLength << 1; long[] array = new long[num]; int num2 = 0; while (num2 < num) { long num3 = m_ints[(uint)num2 >> 1]; array[num2++] = Interleave2_32to64((int)num3); array[num2++] = Interleave2_32to64((int)((ulong)num3 >> 32)); } return new LongArray(array, 0, array.Length); } private static void SquareInPlace(long[] x, int xLen, int m, int[] ks) { int num = xLen << 1; while (--xLen >= 0) { long num2 = x[xLen]; x[--num] = Interleave2_32to64((int)((ulong)num2 >> 32)); x[--num] = Interleave2_32to64((int)num2); } } private static void Interleave(long[] x, int xOff, long[] z, int zOff, int count, int width) { switch (width) { case 3: Interleave3(x, xOff, z, zOff, count); break; case 5: Interleave5(x, xOff, z, zOff, count); break; case 7: Interleave7(x, xOff, z, zOff, count); break; default: Interleave2_n(x, xOff, z, zOff, count, BitLengths[width] - 1); break; } } private static void Interleave3(long[] x, int xOff, long[] z, int zOff, int count) { for (int i = 0; i < count; i++) { z[zOff + i] = Interleave3(x[xOff + i]); } } private static long Interleave3(long x) { return (x & -9223372036854775808) | Interleave3_21to63((int)x & 2097151) | (Interleave3_21to63((int)((ulong)x >> 21) & 2097151) << 1) | (Interleave3_21to63((int)((ulong)x >> 42) & 2097151) << 2); } private static long Interleave3_21to63(int x) { int num = INTERLEAVE3_TABLE[x & 127]; int num2 = INTERLEAVE3_TABLE[((uint)x >> 7) & 127]; return ((INTERLEAVE3_TABLE[(uint)x >> 14] & uint.MaxValue) << 42) | ((num2 & uint.MaxValue) << 21) | (num & uint.MaxValue); } private static void Interleave5(long[] x, int xOff, long[] z, int zOff, int count) { for (int i = 0; i < count; i++) { z[zOff + i] = Interleave5(x[xOff + i]); } } private static long Interleave5(long x) { return Interleave3_13to65((int)x & 8191) | (Interleave3_13to65((int)((ulong)x >> 13) & 8191) << 1) | (Interleave3_13to65((int)((ulong)x >> 26) & 8191) << 2) | (Interleave3_13to65((int)((ulong)x >> 39) & 8191) << 3) | (Interleave3_13to65((int)((ulong)x >> 52) & 8191) << 4); } private static long Interleave3_13to65(int x) { int num = INTERLEAVE5_TABLE[x & 127]; return ((INTERLEAVE5_TABLE[(uint)x >> 7] & uint.MaxValue) << 35) | (num & uint.MaxValue); } private static void Interleave7(long[] x, int xOff, long[] z, int zOff, int count) { for (int i = 0; i < count; i++) { z[zOff + i] = Interleave7(x[xOff + i]); } } private static long Interleave7(long x) { return (x & -9223372036854775808) | INTERLEAVE7_TABLE[(int)x & 511] | (INTERLEAVE7_TABLE[(int)((ulong)x >> 9) & 511] << 1) | (INTERLEAVE7_TABLE[(int)((ulong)x >> 18) & 511] << 2) | (INTERLEAVE7_TABLE[(int)((ulong)x >> 27) & 511] << 3) | (INTERLEAVE7_TABLE[(int)((ulong)x >> 36) & 511] << 4) | (INTERLEAVE7_TABLE[(int)((ulong)x >> 45) & 511] << 5) | (INTERLEAVE7_TABLE[(int)((ulong)x >> 54) & 511] << 6); } private static void Interleave2_n(long[] x, int xOff, long[] z, int zOff, int count, int rounds) { for (int i = 0; i < count; i++) { z[zOff + i] = Interleave2_n(x[xOff + i], rounds); } } private static long Interleave2_n(long x, int rounds) { while (rounds > 1) { rounds -= 2; x = (Interleave4_16to64((int)x & 65535) | (Interleave4_16to64((int)((ulong)x >> 16) & 65535) << 1) | (Interleave4_16to64((int)((ulong)x >> 32) & 65535) << 2) | (Interleave4_16to64((int)((ulong)x >> 48) & 65535) << 3)); } if (rounds > 0) x = (Interleave2_32to64((int)x) | (Interleave2_32to64((int)((ulong)x >> 32)) << 1)); return x; } private static long Interleave4_16to64(int x) { int num = INTERLEAVE4_TABLE[x & 255]; return ((INTERLEAVE4_TABLE[(uint)x >> 8] & uint.MaxValue) << 32) | (num & uint.MaxValue); } private static long Interleave2_32to64(int x) { int num = INTERLEAVE2_TABLE[x & 255] | (INTERLEAVE2_TABLE[((uint)x >> 8) & 255] << 16); return (((INTERLEAVE2_TABLE[((uint)x >> 16) & 255] | (INTERLEAVE2_TABLE[(uint)x >> 24] << 16)) & uint.MaxValue) << 32) | (num & uint.MaxValue); } public LongArray ModInverse(int m, int[] ks) { int num = Degree(); switch (num) { case 0: throw new InvalidOperationException(); case 1: return this; default: { LongArray longArray = Copy(); int intLen = m + 63 >> 6; LongArray longArray2 = new LongArray(intLen); ReduceBit(longArray2.m_ints, 0, m, m, ks); LongArray longArray3 = new LongArray(intLen); longArray3.m_ints[0] = 1; LongArray longArray4 = new LongArray(intLen); int[] array = new int[2] { num, m + 1 }; LongArray[] array2 = new LongArray[2] { longArray, longArray2 }; int[] array3 = new int[2] { 1, 0 }; LongArray[] array4 = new LongArray[2] { longArray3, longArray4 }; int num2 = 1; int num3 = array[num2]; int num4 = array3[num2]; int num5 = num3 - array[1 - num2]; while (true) { if (num5 < 0) { num5 = -num5; array[num2] = num3; array3[num2] = num4; num2 = 1 - num2; num3 = array[num2]; num4 = array3[num2]; } array2[num2].AddShiftedByBitsSafe(array2[1 - num2], array[1 - num2], num5); int num6 = array2[num2].DegreeFrom(num3); if (num6 == 0) break; int num7 = array3[1 - num2]; array4[num2].AddShiftedByBitsSafe(array4[1 - num2], num7, num5); num7 += num5; if (num7 > num4) num4 = num7; else if (num7 == num4) { num4 = array4[num2].DegreeFrom(num4); } num5 += num6 - num3; num3 = num6; } return array4[1 - num2]; } } } public override bool Equals(object obj) { return Equals(obj as LongArray); } public virtual bool Equals(LongArray other) { if (this == other) return true; if (other == null) return false; int usedLength = GetUsedLength(); if (other.GetUsedLength() != usedLength) return false; for (int i = 0; i < usedLength; i++) { if (m_ints[i] != other.m_ints[i]) return false; } return true; } public override int GetHashCode() { int usedLength = GetUsedLength(); int num = 1; for (int i = 0; i < usedLength; i++) { long num2 = m_ints[i]; num *= 31; num ^= (int)num2; num *= 31; num ^= (int)((ulong)num2 >> 32); } return num; } public LongArray Copy() { return new LongArray(Arrays.Clone(m_ints)); } public override string ToString() { int usedLength = GetUsedLength(); if (usedLength == 0) return "0"; StringBuilder stringBuilder = new StringBuilder(Convert.ToString(m_ints[--usedLength], 2)); while (--usedLength >= 0) { string text = Convert.ToString(m_ints[usedLength], 2); int length = text.Length; if (length < 64) stringBuilder.Append("0000000000000000000000000000000000000000000000000000000000000000".Substring(length)); stringBuilder.Append(text); } return stringBuilder.ToString(); } } }