fork download
  1. import math,time,random
  2.  
  3. def miller(N,bases=(2,3,5,7,11,13)):
  4. if N<2:return False
  5. if N in bases:return True
  6. if N%2==0:return False
  7. d=N-1;s=0
  8. while d%2==0:d>>=1;s+=1
  9. for a in bases:
  10. if a>=N:continue
  11. x=pow(a,d,N)
  12. if x==1 or x==N-1:continue
  13. for _ in range(s-1):
  14. x=pow(x,2,N)
  15. if x==N-1:break
  16. else:return False
  17. return True
  18.  
  19. SP=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
  20.  
  21. print("=== pow(a,d,N) speed ===")
  22. for bits in [64,128,256,512,1024]:
  23. N=(1<<bits)+643;it=max(1,min(500,50000//bits))
  24. t0=time.perf_counter()
  25. for _ in range(it):pow(2,N-1,N)
  26. t=(time.perf_counter()-t0)/it
  27. print(f"{bits:>5}b: {t*1e6:>8.0f} us")
  28.  
  29. print("\n=== Next prime ===")
  30. for s in [10**6,10**9,10**12]:
  31. N=s+1
  32. if N%2==0:N+=1
  33. sk=0;mt=0;t0=time.perf_counter()
  34. while True:
  35. if any(N%p==0 for p in SP if p<N):sk+=1;N+=2;continue
  36. mt+=1
  37. if miller(N):break
  38. N+=2
  39. t=time.perf_counter()-t0
  40. print(f"dopo {s:.0e}: gap={N-s} {t*1000:.1f}ms sieve={sk} miller={mt}")
  41.  
  42. print("\n=== RSA prime gen ===")
  43. random.seed(42)
  44. for bits in [256,512]:
  45. times=[]
  46. for _ in range(3):
  47. t0=time.perf_counter()
  48. while True:
  49. N=random.getrandbits(bits)|(1<<(bits-1))|1
  50. if any(N%p==0 for p in SP):continue
  51. if miller(N):break
  52. times.append(time.perf_counter()-t0)
  53. print(f"{bits}b: {sum(times)/3*1000:.1f}ms avg")
  54.  
  55. print("\n=== Mersenne ===")
  56. for p in [31,61,89,107,127]:
  57. M=(1<<p)-1;t0=time.perf_counter()
  58. r=miller(M);t=time.perf_counter()-t0
  59. print(f"M{p}: {'PRIMO' if r else 'COMP'} {t*1e6:.0f}us")
  60.  
  61. print("\nDone!")
Success #stdin #stdout 0.49s 14212KB
stdin
Standard input is empty
stdout
=== pow(a,d,N) speed ===
   64b:       11 us
  128b:       31 us
  256b:      117 us
  512b:      804 us
 1024b:     3671 us

=== Next prime ===
dopo 1e+06: gap=3 0.0ms sieve=0 miller=2
dopo 1e+09: gap=7 0.0ms sieve=3 miller=1
dopo 1e+12: gap=39 0.1ms sieve=17 miller=3

=== RSA prime gen ===
256b: 3.8ms avg
512b: 38.6ms avg

=== Mersenne ===
M31: PRIMO 37us
M61: PRIMO 88us
M89: PRIMO 115us
M107: PRIMO 165us
M127: PRIMO 241us

Done!