public static void calcCompare(int PrevX, int PrevMod, int ModNumber) { int GCDCount = GCD.countGcd(PrevX, ModNumber); if (PrevMod % GCDCount != 0) { Console.WriteLine("Error - can't find compare number"); } else { Console.WriteLine($"Found {GCDCount} solutions"); if (GCDCount != 1) { PrevX /= GCDCount; PrevMod /= GCDCount; ModNumber /= GCDCount; Console.WriteLine($"{PrevX}X= {PrevMod} (mod {ModNumber})"); } int ResultNumber = (int)(Math.Pow(PrevX, EulerFunction.calcEulerFunction(ModNumber) - 1)) % ModNumber; if (ResultNumber < 0) { ResultNumber += ModNumber; } Console.WriteLine($"ResultNumber of {PrevX} = {ResultNumber}"); PrevX = ResultNumber * PrevX; PrevMod = ResultNumber * PrevMod; Console.WriteLine($"{PrevX}x = {PrevMod}(mod {ModNumber})"); if (PrevX > ModNumber) { PrevX %= ModNumber; } if (PrevMod > ModNumber) { PrevMod %= ModNumber; } Console.WriteLine($"x = {PrevMod} + {ModNumber}k"); for (int i = 0; i < GCDCount; i++) { Console.WriteLine($"x = {PrevMod+ModNumber*i} (mod {GCDCount*ModNumber})"); } } }
public static void countRoot(int m) { int phi = EulerFunction.calcEulerFunction(m); Dictionary <int, int> fact = primeFactorization.count(phi); int count = 0; foreach (var item in fact) { if (GCD.countGcd(item.Key, m) == 1) { bool check = true; foreach (var itemNext in fact) { if (BigInteger.ModPow(item.Key, itemNext.Key, m) == 1) { check = false; } } if (check) { count++; Console.WriteLine(); Console.WriteLine($"{item.Key} - Antiderivative root"); Console.Write($"U({m})= " + "{"); for (var i = 0; i < phi; i++) { Console.Write($" {BigInteger.ModPow(item.Key, i, m)} "); } Console.WriteLine("}"); } } } if (count == 0) { Console.WriteLine(" - Not antiderivative root"); } }