/// <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);
 }