Subversion Repositories Code-Repo

Rev

Blame | Last modification | View Log | RSS feed


def PollardPM1(N,B):
        '''Implementation of the Pollard p-1 algorithm for factoring primes'''
        a = 2;
        for i in range(2,B):
                a = a**i % N
        d = GCD(a-1,N)
        if 1 < d < N:
                return d
        else:
                return -1;

def PollardRho(N,x_1):
        '''Implementation of the Pollard Rho algorithm for factoring primes'''
        x = x_1
        y = PollardRhoHelper(x) % N
        g = GCD(abs(x-y),N)
        iterations = 0;
        while g == 1:
                        iterations += 1
                        x = PollardRhoHelper(x) % N
                        y = PollardRhoHelper(y) % N
                        y = PollardRhoHelper(y) % N
                        g = GCD(abs(x-y),N)
        print("Iterations: %d\n" % (iterations))
        if g == N:
                return -1
        else:
                return g
        
def PollardRhoHelper(x):
        return x**2 + 1

def Extended_Euclidian(a, b):
        ''' Takes values a and b and returns a tuple (r,s,t) in the following format:
                r = s * a + t * b where r is the GCD and s and t are the inverses of a and b'''
        t_ = 0
        t = 1
        s_ = 1
        s = 0
        q = int(a/b)
        r = a - q * b
        # print("%d\t= %d * %d + %d" % (a, q, b, r))
        while r > 0:
                temp = t_ - q * t
                t_ = t
                t = temp
                temp = s_ - q * s
                s_ = s
                s = temp
                a = b
                b = r
                q = int(a/b)
                r = a - q * b
                # print("%d\t= %d * %d + %d" % (a, q, b, r))
        r = b
        return (r, s, t)

def GCD(q,N):
        '''Returns the multiplicative inverse of a and b'''
        ret = Extended_Euclidian(q,N)
        return ret[0]

def Inverse(a, b):
        '''Returns the multiplicative inverse of a mod b'''
        ret = Extended_Euclidian(a,b)
        if (ret[1] < 0):
                inv = ret[1] + b
        else:
                inv = ret[1]
        return inv

if __name__ == '__main__':
        prime1 = 112426043
        prime2 = 262063
        prime3 = 9420457

        for i in range(100):
                p = PollardPM1(prime1,i)
                if p != -1:
                        print("Prime found with B = %d with value %d\n" % (i,p))
                        break

        p = PollardRho(prime2,1)
        print("A prime factor of %d is %d\n" % (prime2,p))

        p = PollardRho(prime3,1)
        print("A prime factor of %d is %d\n" % (prime3,p))