A function in my factor package return zeros instead of the correct value. It did this for several times, and then returned the correct value. I inserted print statements in the function and in the calling routine which document this behavior. The calling routine is function function fermat. The function being called is function strongfac. To see the test results , run the function testrange with parameters testrange(10**14+37,10**14+37). Since it takes quite a lot of work to make a copy that survives the email removal of leading blanks I attach the package of function routines here. Results as run on my machine: Python 2.4.2 (#67, Sep 28 2005, 12:41:11) [MSC v.1310 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information.
IDLE 1.1.2 >>> import factor34 >>> from factor34 import testrange >>> testrange(10**14+37,10**14+37) Begin calculating constants to be used in factoring. Finished calculating constants to be used in factoring. Search for a factor of 100000000000037 Could not find factors by strong probable prime test using witnesses < 10000. Try to find factors by using power of 2 mod z as a witness. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 0 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 1 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 2 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 3 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 4 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 5 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 6 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 7 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 8 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 9 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 10 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 11 x = 0 y = 0 face = [0, 0, 0] Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 12 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 15306543515214 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 13 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 12123044576953 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 14 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 45391315949900 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 15 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 59571344259390 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 16 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 78029752396948 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 17 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 35863146075772 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 18 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 19712913203085 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 19 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 14607414373499 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 20 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 57761947468766 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 21 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 75604347243674 . Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. Retrieved from strongfac, face = [0, 0, 0] In fermat: k = 22 x = 0 y = 0 face = [0, 0, 0] In strongfac Found1: x = 53799857 Found1: y = 1858741 face = [53799857L, 1858741L, 0] Found1: factor by strong probable prime test, using witnes 3561873332543 Found1: factors are 53799857 1858741 Found1: returning [53799857L, 1858741L, 0] to fermat routine. In strongfac Found1: x = 1858741 Found1: y = 53799857 face = [1858741L, 53799857L, 0] Found1: factor by strong probable prime test, using witnes 96058894729069 . Found1: factors are 1858741 53799857 Found1: returning [1858741L, 53799857L, 0] to fermat routine. Retrieved from strongfac, face = [1858741L, 53799857L, 0] In fermat: k = 23 x = 1858741 y = 53799857 face = [1858741L, 53799857L, 0] index of torial is 23 z = 100000000000037 x = 1858741 y = 53799857 difficulty = 0 >>> Kermit Rose < [EMAIL PROTECTED] >
def testrange(za,zb): print " Begin calculating constants to be used in factoring." pmap = setpmap() plist = setplist(pmap) sqlist = setsqlist(plist) sqresidue = setsqresidue(sqlist) sqroot = setsqroot(sqlist) torials = range(100) for k in range(100): mpy = 1 for j in range(1,101): mpy = mpy * (100 * k + j) torials[k] = mpy print " Finished calculating constants to be used in factoring." for z in range(za,zb+1,2): testz(z,pmap,plist,sqlist,sqresidue,torials) def ABCD(z): D = (z-1)/2 if D%2 == 0: stlist = [ [0,0],[1,1]] cst = 2 else: stlist = [ [0,1],[1,0] ] cst = 2 qlist = [ [0,2,2,1,1,D,cst,stlist ] ] cabcd = 0 maxcabcd = 0 stop = 0 level = 0 stop = 0 while stop == 0: # print " " # print " cabcd = ",cabcd # print " qlist[cabcd] = ",qlist[cabcd] stop1 = 0 while stop1 == 0: # print " " # print " cabcd = ",cabcd if cabcd < 0: break cst = qlist[cabcd][6] # print " cst = ",cst qlist[cabcd][6] = cst = cst-1 # print " new cst = ",cst A = qlist[cabcd][2] D = qlist[cabcd][5] # print " A = ",A," D = ",D," cst = ",cst flag = 0 if cst < 0: flag = 1 if (A - z) > 0: flag = 1 if (D+z) < 0: flag = 1 if flag ==0: break if flag == 1: cabcd = cabcd - 1 # print " Backtrack to previous qlist entry. " # print " cabcd = ",cabcd # if cabcd > -1: # print " qlist[cabcd] = ",qlist[cabcd] if cabcd < 0: break level = level + 1 # print " " # print " cabcd = ",cabcd # print " qlist[cabcd] = ",qlist[cabcd] # print " cabcd = ",cabcd," cst = ",cst # print " qlist[cabcd] = ",qlist[cabcd] s = qlist[cabcd][7][cst][0] t = qlist[cabcd][7][cst][1] A = qlist[cabcd][2] B = qlist[cabcd][3] C = qlist[cabcd][4] D = qlist[cabcd][5] p = qlist[cabcd][1] # print " cabcd = ",cabcd, " p = ",p," A = ",A," B = ",B," C = ",C," D = ",D," cst = ",cst," s = ",s," t = ",t # print " qlist[cabcd] = ",qlist[cabcd] testz = A * D + B * C if testz != z: print " Error. z should have be = A * D + B * C ", " A * D + B * C = ",testz," z = ",z if D == 0: fac = testfac(z,B) if fac[0] != 0: fac[2] = [p,0,level] return fac fac = testfac(z,B) if fac[0] != 0: fac[2] = [p,1,level] return fac fac = testfac(z,C) if fac[0] != 0: fac[2] = [p,2,level] return fac fac = testfac(z,kabs(A - B) ) if fac[0] != 0: fac[2] = [p,3,level] return fac fac = testfac(z,kabs(A+B)) if fac[0] != 0: fac[2] = [p,4,level] return fac fac = testfac(z,kabs(A-C)) if fac[0] != 0: fac[2] = [p,5,level] return fac fac = testfac(z,kabs(D - B)) if fac[0] != 0: fac[2] = [p,6,level] return fac fac = testfac(z,kabs(D + B)) if fac[0] != 0: fac[2] = [p,7,level] return fac fac = testfac(z,kabs(D - C)) if fac[0] != 0: fac[2] = [p,8,level] return fac fac = testfac(z,kabs(D + C)) if fac[0] != 0: fac[2] = [p,9,level] return fac fac = testfac(z,kabs(A + B + C - D)) if fac[0] != 0: fac[2] = [p,10,level] return fac fac = testfac(z,kabs(A + B - C + D)) if fac[0] != 0: fac[2] = [p,11,level] return fac fac = testfac(z,kabs(A - B + C + D)) if fac[0] != 0: fac[2] = [p,12,level] return fac fac = testfac(z,kabs(-A + B + C + D)) if fac[0] != 0: fac[2] = [p,13,level] return fac # print " " # print " calculate next set of A,B,C,D,s,t" # print " s = ",s," t = ",t," A = ",A," B = ",B, " C = ",C," D = ",D A,B,C,D = A*p,B + A * t,C + A*s,(D - A * s * t - B * s - C * t)/p # print " A = ",A," B = ",B," C = ",C," D = ",D cst = 0 stlist = [] Dtest = D%p for s in range(p): for t in range(p): test = (A * s * t + B * s + C * t)%p if test == Dtest: stlist.append([s,t]) cst = cst + 1 # print " Adding solution ", " cst = ",cst, " [s,t] = ",[s,t] cabcd = cabcd + 1 # print " Added ",cst," solutions."," cabcd = ",cabcd if cabcd > maxcabcd: qlist.append( [cabcd,p,A,B,C,D,cst,stlist] ) qlist[cabcd][6] = cst maxcabcd = maxcabcd + 1 else: qlist[cabcd] = [cabcd,p,A,B,C,D,cst,stlist] qlist[cabcd][6] = cst # print " qlist[cabcd] = ",qlist[cabcd] # print " " # print " cabcd = ",cabcd # print " qlist[cabcd] = ",qlist[cabcd] return [1,z,[p,14,level]] def testfac(z,w): if w == 0: fac = [0,0,0] return fac x = gcd(z,w) if x > 1: y = z/x fac = [x,y,0] return fac fac = [0,0,0] return fac def kabs(w): if w < 0: return -w return w def testz(z,pmap,plist,sqlist,sqresidue,torials): fac = fermat(z,1,pmap,plist,sqlist,sqresidue,torials) print " z = ",z," x = ",fac[0]," y = ",fac[1]," difficulty = ",fac[2] def setsqlist(plist): sqlist = plist[0:] sqlist[1] = 8 return sqlist def setsqresidue(sqlist): sqresidue = range(1230) for j in range(1,1230): p = sqlist[j] sqresidue[j] = range(p) for k in range(p): sqresidue[j][k] = -1 # print " j = ",j," p = ",p," sqresidue[j] = ",sqresidue[j] half = (p+1)/2 for k in range(half): k2 = k*k%p sqresidue[j][k2] = 1 # print " j = ",j," p = ",p," sqresidue[j] = ",sqresidue[j] # print " " return sqresidue def setsqroot(sqlist): sqroot = range(1230) sqroot[1] = [0,1,-1,-1,2,-1,-1,-1] for j in range(2,1230): p = sqlist[j] sqroot[j] = range(p) for k in range(p): sqroot[j][k] = -1 half = (p+1)/2 for k in range(half): k2 = k*k%p sqroot[j][k2] = k return sqroot def ifprobsq(z,sqlist,sqresidue): for k in range(1,1230): p = sqlist[k] r = z%p q = sqresidue[k][r] if q == -1: return -1 return 1 def fermat(z,maxdiff,pmap,plist,sqlist,sqresidue,torials): # maxdiff should be set to one less than number of expected factors. print " " print " Search for a factor of ",z if maxdiff < 1: maxdiff = 1 if z < 0: fac = range(3) fac[0] = -1 fac[1] = z fac[2] = 0 print " Found factors from z is negative." return fac if z == 0: fac = range(3) fac[0] = 0 fac[1] = 0 fac[2] = 0 print " Found factors from z == 0." return fac if z == 1: fac = range(3) fac[0] = 1 fac[1] = 1 fac[2] = 0 print " Found factors from z == 1." return fac if z%2 == 0: fac = range(3) fac[0] = 2 fac[1] = z/2 fac[2] = 0 print " Found factors from z is even." return fac if z < 10000: if pmap[z] == z: fac = range(3) fac[0] = 1 fac[1] = z fac[2] = 0 print " Found factors by z is prime < 10000." return fac q = ifprime(z,plist) if q == 1: fac = range(3) fac[0] = 1 fac[1] = z fac[2] = 1 print " Found factors by z is probabble prime > 10000." return fac for k in range(2,1230): p = plist[k] if z%p == 0: fac = range(3) fac[0] = p fac[1] = z/p fac[2] = k print " Found factors by z is divisible by prime < 10000." return fac print " " fac = miller(z) if fac[0] != 0: return fac for j in range(2,6): print " " print " Try to find factors by using power of ",j," mod z as a witness." w2 = j for k in range(100): w = pow(j,torials[k],z) face = strongfac(z,w) print " Retrieved from strongfac, face = ",face x = face[0] y = face[1] print " In fermat: k = ",k," x = ",x," y = ",y," face = ",face if face[0] != 0: print " index of torial is ",k return face if k == 0: w2 = w else: w2 = pow(w2,torials[k],z) fac = strongfac(z,w2) print " " print " Could not find factors by strong probable prime test." r = ksqrt(z) if r * r == z: x = r y = r fac = range(3) fac[0] = x fac[1] = y fac[2] = 0 print " Found factors by z is square." return fac r = ksqrt(z) for j in range(1,maxdiff+1): t = r + j d = t * t - z ifsq = ifprobsq(d,sqlist,sqresidue) if ifsq == 1: r2 = ksqrt(d) if d == r2 * r2: x = t - r2 y = t + r2 fac = range(3) fac[0] = x fac[1] = y fac[2] = 1 if j%10 == 1: print " Found factors by ",j,"st square > z is z + a square." elif j%10 == 2: print " Found factors by ",j,"nd sqare > z is z + a square." elif j%10 == 3: print " Found factors by ",j,"rd square > z is z + a square." else: print " found factors by ",j,"th, square > z is z + a square." return fac # call def diffsq(mpy,z,maxdiff,difficulty,sqlist,sqresidue) for mpy in range(2,10000) print " " print " Begin to look for simple multiple of z to be difference of squares." difficulty = [0,0] for mpy in range(3,10000,4): difficulty[0] = difficulty[0] + 1 fac = diffsq(mpy,z,maxdiff,difficulty,sqlist,sqresidue) if fac[0] != 0: return fac difficulty[0] = difficulty[0] + 1 fac = diffsq(mpy+1,z,maxdiff,difficulty,sqlist,sqresidue) if fac[0] != 0: return fac difficulty[0] = difficulty[0] + 1 fac = diffsq(mpy+2,z,maxdiff,difficulty,sqlist,sqresidue) if fac[0] != 0: return fac print " " print " Could not factor z by finding a simple multiple of z to be a difference of squares." print " " print " Try to find factors by AD + BC = z method. " fac = ABCD(z) if fac[0] != 0: print " Found factor by method AD + BC = z." return fac print " Could not factor z by AD + BC = z method. " print " Begin final resort routine." mpylist = setmpylist(z,plist) # print " mpylist = ",mpylist lenmult = len(mpylist) mult = range(lenmult) for k in range(lenmult): mult[k] = 0 # zlim = log_2(2 * z) zlim = 0 temp = 2 * z while temp > 1: temp = temp/2 zlim = zlim + 1 # print " zlim = ",zlim flag = 0 difficulty = range(2) difficulty[0] = 1 difficulty[1] = 0 while flag == 0: difficulty[0] = difficulty[0] + 1 mult = incr(mult,zlim,mpylist) # print " mult = ",mult," difficulty = ",difficulty if mult[0] == -1: print "Fermat algorithm Could not factor z " fac = range(3) fac[0] = 1 fac[1] = z fac[2] = difficulty return fac mpy = 1 lenmult = len(mult) for k in range(lenmult): j = lenmult-1 - k if mult[j] != 0: mpy = mpy * mpylist [j] [0] **mult[j] fac = diffsq(mpy,z,maxdiff,difficulty,sqlist,sqresidue) if fac[0] != 0: return fac # mpylist contains the vector of multipliers. # each element of mpylist is a vector of size 2. # mpylist[k][0] is kth multiplier. # mpylist[k][1] is approximately log_2 of kth multiplier def setmpylist(z,plist): flag = 0 mpylist = [[2,1]] curr = 1 lenmpylist = 1 dex = 1 while flag == 0: m = 2 * curr + 1 dex = dex + 1 actdex = dex if m > z: break q = m for k in range(lenmpylist): d = mpylist [k][0] f = mpylist [k][1] rflag = 0 while rflag == 0: quo = q/d r = q - quo * d # print " z = ",z," m = ",m," q = ",q," k = ",k," d = ",d," f = ",f," quo = ",quo," r = ",r," actdex = ",actdex if r == 0: q = quo actdex = actdex - f else: rflag = 1 if q > 1: mpylist.append([q,actdex]) lenmpylist = lenmpylist + 1 curr = m return mpylist def diffsq(mpy,z,maxdiff,difficulty,sqlist,sqresidue): za = mpy * z r = ksqrt(za) if za == r * r: x = gcd(z,r) if x > 1: if x < z: y = z/x fac = range(3) fac[0] = x fac[1] = y fac[2] = difficulty return fac for j in range(1,maxdiff+1): t = r + j d = t * t - za ifsq = ifprobsq(d,sqlist,sqresidue) if ifsq == 1: difficulty[1] = difficulty[1] + 1 rd = ksqrt(d) if rd * rd == d: x = gcd(z,t - rd) if x > 1: if x < z: y = z/x fac = range(3) fac[0] = x fac[1] = y fac[2] = difficulty if j%10 == 1: print " Found factors by ",j,"st square > some multiple of z, za, is za + a square." elif j%10 == 2: print " Found factors by ",j,"nd square > some multiple of z, za, is za + a square." elif j%10 == 3: print " Found factors by ",j,"rd square > some multiple of z, za, is za + a square." else: print " found factors by ",j,"th, square > some multiple of z, za, is za + a square." return fac y = gcd(z,t+rd) if y > 1: if y < z: x = z/y fac = range(3) fac[0] = x fac[1] = y fac[2] = difficulty if j%10 == 1: print " Found factors by ",j,"st square > z, za, is za + a square." elif j%10 == 2: print " Found factors by ",j,"nd square > z, za, is za + a square." elif j%10 == 3: print " Found factors by ",j,"rd square > z, za, is za + a square." else: print " found factors by ",j,"th, square > z, za, is za + a square." return fac fac = range(3) fac[0] = 0 fac[1] = 0 fac[2] = difficulty return fac def incr(mult,zlim,mpylist): # mult is a vector of exponents for the multipliers in mpylist. # z is the integer to be factored # zlim is the critical value for the sum of multiplier * index # where kth multiplier is mpylist [k][0] # and kth index is mpylist [k][1] # function incr returns the next value of vector mult. # mult may be thought as a number written in a variable base. # mult[0] is the least significant and matches multiplier mpylist[0][0] # adding one to mult would mean adding 1 to mult[0] # unless doing so would make sum of mpylist[k][1] * mult[k] exceed zlim. # in that case mult[0] is set to zero, and 1 is added to mult[1] # unless doing so would make sum of multilier * index exceed zlim # in that case, mult[0] and mult[1] is set to zero, # and 1 is added to mult[2] # unless . . . # mult[0] is set to -1 to indicate that the largest possible value of mult has been exceeded. # mpylist[0] = 2 and all other values in mpylist are odd. # mult[0], the index on multiplier 2, must not equal 1. It may equal zero, or any integer > 1, # provided it meets the zlim constraint. smalllim = 13 lenmult = len(mult) lim = lenmult+0 for k in range(lim): if mult[k] == 0: lenmult = lenmult - 1 else: break mult[0] = mult[0]+1 if mult[0] ==1: mult[0] = 2 testsum = 0 for j in range(0,lenmult): testsum = testsum + mpylist[j][1] * mult[j] if testsum < smalllim: mult[0] = mult[0] + (smalllim - testsum)/2 if testsum < zlim: return mult for k in range(1,lenmult): mult[k] = mult[k] + 1 testsum = 0 if k > 0: mult[k-1] = 0 for j in range(k,lenmult): testsum = testsum + mpylist[j][1] * mult[j] if testsum < smalllim: mult[k] = mult[k] + (smalllim - testsum)/mpylist[k][0] if testsum < zlim: return mult mult[0] = -1 return mult def ksqrt(z): if z == 0: return 0 j = 1 k = z flag = 0 while flag == 0: j = k k = (j + z/j)/2 if k == j + 1: return j if k == j: return j def gcd(a,b): r1 = a r2 = b flag = 0 while flag == 0: r3 = r1%r2 if r3== 0: return r2 r1 = r2 r2 = r3 # print "Testing gcd: r1 = ",r1," r2 = ",r2 ### write alternative strong(z,w) subroutine that ### also tests for factors in the case that ### w is witness for z being a weak probable prime. def strong(z,w): trace = 0 t = z - 1 a = 0 while t%2 == 0: t = t/2 a = a + 1 test = pow(w,t,z) if test ==1: q = 1 return q if test + 1 == z: q = 1 return q for j in range (1,a): test = (test * test)%z if test + 1 == z: q = 1 return q q = 0 if trace > 0: print " found ",z," is composite, with witness = ",w return q def miller(z): for p in range(2,10000): fac = strongfac(z,p) if fac[0] != 0: return fac print " Could not find factors by strong probable prime test using witnesses < 10000." fac[0] = 0 fac[1] = 0 fac[2] = 0 return fac def strongfac(z,w): trace = 0 t = z - 1 a = 0 while t%2 == 0: t = t/2 a = a + 1 test = pow(w,t,z) if test ==1: q = 1 fac = [1,z,0] return fac else: x = gcd(test-1,z) if x > 1: print " " print " In strongfac " print " Found1: x = ",x if x < z: y = z/x print " Found1: y = ",y face = [x,y,0] print " face = ",face face[0] = x face[1] = y face[2] = 0 print " Found1: factor by strong probable prime test, using witnes ",w," ." print " Found1: factors are ",face[0],face[1] print " Found1: returning ",face," to fermat routine." return face if test + 1 == z: q = 1 fac = [1,z,0] return fac for j in range (1,a): test = (test * test)%z test1 = test + 1 if test1 == z: q = 1 fac = [1,z,j] return fac else: x = gcd(test1,z) if x > 1: if x < z: print " " print " In Strongfac " y = z/x fac = [x,y,j] print " Foundj factor by strong probable prime test, using witness,",w," ." print " Returning ",fac," to fermat routine." return fac q = 0 fac = [0,0,0] return fac def ifprime(z,plist): for j in range(1,1230): w = plist[j] if w == z: q = 1 return q q = strong(z,w) if q == 0: return q return 1 def setplist(pmap): plist = range(1230) n = 0 if pmap[3] != 3: print " pmap has not been calculated! " return for j in range(2,10000): if pmap[j] != -1: n = n + 1 plist[n] = j plist[0] = n return(plist) def setpmap(): pmap=range(10001) pmap[0] = 0 pmap[1] = 0 pmap[2] = 2 for j in range(3,10000,2): pmap[j] = j pmap[j+1] = -1 for k in range(3,100,2): if pmap[k] != -1: jstart = k*k jend = 10000 jinc = 2 * k for j in range(jstart,jend,jinc): pmap[j] = -1 return(pmap)
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor