Exemple #1
0
        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})");
                }
            }
        }
Exemple #2
0
        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");
            }
        }