/// <summary> /// Metoda wyznaczajaca dzielniki n. /// Zwraca liste dzielnikow. Petla ograniczona do 25 iteracji. /// </summary> /// <param name="n"></param> /// <param name="startx"></param> /// <param name="c"></param> /// <returns>Zwraca listę dzielników, każdy może wystąpic na niej tylko raz</returns> public List <long> GetPollardRhoFactorsList(long n, long startx, long c) { const int maxiters = 25; //maksymalna ilosc iteracji algorytmu List <long> factors = new List <long>(); long x = startx; long y = startx; long d = 1; int iters = 0; while ((d != n) && (iters < maxiters)) { x = f(x, c, n); y = f(f(y, c, n), c, n); d = NumbersTheory.GCDBinary(Math.Abs(x - y), n); if ((d > 1) && (d < n)) { if (!factors.Contains(d)) { factors.Add(d); } } iters++; } return(factors); }
/// <summary> /// Metoda wyznaczajaca dzielniki n. /// Zwraca pierwszy znaleziony dzielnik. /// </summary> /// <param name="n"></param> /// <param name="startx"></param> /// <param name="c"></param> /// <returns></returns> public List <long> GetPollardRhoSingleFactor(long n, long startx, long c) { List <long> factors = new List <long>(); long x = startx; long y = startx; long d = 1; while (d != n) { x = f(x, c, n); y = f(f(y, c, n), c, n); d = NumbersTheory.GCDBinary(Math.Abs(x - y), n); if ((d > 1) && (d < n)) { factors.Add(d); break; } } return(factors); }
private long f(long x, long c, long n) { //return (x*x + c)%n; return((NumbersTheory.ExpMod(x, 2, n) + c) % n); }