/// <summary> /// 计算欧拉函数Φ(m), 即0与m之间与m互素的整数个数 /// </summary> /// <param name="number"></param> /// <param name="relativePrimes"></param> /// <returns></returns> public static long GetRelativelyPrimeCount(long number, out List <long> relativePrimes) { relativePrimes = new List <long>(); if (number < 1) { throw new ArgumentException("Number should be positive integers."); } for (long i = 1; i <= number; i++) { var gcd = GCD.GetGCD(i, number); if (gcd == 1) { relativePrimes.Add(i); } } return(relativePrimes.Count); }
public List <long> GetSolution() { long gcd = GCD.GetGCD(_a, _m); if (_c % gcd != 0) { Console.WriteLine("gcd(a, m) can't divide c, this congruence has no solution."); return(null); } var solution = GCD.GetSolution_LinearAxBy(_a, _m); if (solution == null) { Console.WriteLine("Solution of ax + my = gcd(a, m) is null."); return(null); } long factor = _c / gcd; long u0 = solution[0]; long x0 = factor * u0; long factor2 = _m / gcd; List <long> result = new List <long>(); for (int i = 0; i < gcd; i++) { var temp = x0 + i * factor2; if (temp >= _m) { temp = temp % _m; } if (temp < 0) { temp = _m - Math.Abs(temp) % _m; } result.Add(temp); } return(result); }