jukaukor

Kongruenssiyhtalo2.jl

May 24th, 2020
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. # Kongruenssiyhtälön 2^(n-2) = 1 (mod n) ratkaisut
  2. using Primes
  3.  
  4. function factors(n)
  5. f = [one(n)]
  6. for (p,e) in factor(n)
  7. f = reduce(vcat, [f*p^j for j in 1:e], init=f)
  8. end
  9. return length(f) == 1 ? [one(n), n] : sort!(f)
  10. end
  11.  
  12. function multorder(a, m)
  13. gcd(a,m) == 1 || error("$a and $m are not coprime")
  14. res = one(m)
  15. for (p,e) in factor(m)
  16. m = p^e
  17. t = div(m, p) * (p-1)
  18. for f in factors(t)
  19. if powermod(a, f, m) == 1
  20. res = lcm(res, f)
  21. break
  22. end
  23. end
  24. end
  25. return res
  26. end
  27. # multiplicative order of 2 modulo primes
  28. b= primes(1,1000000);
  29. max = length(b);
  30.  
  31. function sopivat_alkuluvut(max)
  32. properprimes = Int64[] # kongruenssiyhtälölle kelvolliset kanditaatit
  33. # multorder(2,p) pariton ja p jaettuna 8:lla antaa jakojäännöksen 1 tai 7
  34. s = 0
  35. for i in 2 : max
  36. if multorder(2,b[i]) % 2 != 0 && (b[i] % 8 == 1 || b[i] % 8 == 7)
  37. #println(b[i])
  38. s += 1
  39. push!(properprimes,b[i])
  40. end
  41. end
  42. println("sopivia alkulukuja oli ",s)
  43. return properprimes
  44. end
  45. # testaan kelvollisilla alkulukukanditaateilla p kongruenssiyhtälö
  46. # testataan n = q*p =(k*ord(2,p))+2)*p yhtälölle 2^(n-2) = 1 (mod n)
  47. properprimes = sopivat_alkuluvut(max);
  48. nnumbers = Int64[]
  49. nmaxproper =length(properprimes)
  50. half1 = div(nmaxproper,2)+1 # alkulukujen puoliväli
  51. half2 = half1-1 # toinen puolisko
  52. # lasketaan ensin suurimpien alkulukutekiojöiden avulla
  53. # näin saadaan sisäsilmukan k:t pieniksi
  54. for i in nmaxproper : -1 : half1 # aloitetaan suurimmista alkuluvuista
  55. mult = multorder(2,properprimes[i])
  56. for k in 1 : 2: 100000
  57. n = (k*mult+2)*properprimes[i]
  58. if powermod(2,n-2,n)==1
  59. #println(n," factors: ",factor(n))
  60. push!(nnumbers,n)
  61. end
  62. end
  63. end
  64. for i in half2 : -1 : 1 # jatketaan puolivalista alkuun
  65. mult = multorder(2,properprimes[i])
  66. for k in 1 : 2: 100000
  67. n = (k*mult+2)*properprimes[i]
  68. if powermod(2,n-2,n)==1
  69. #println(n," factors: ",factor(n))
  70. push!(nnumbers,n)
  71. end
  72. end
  73. end
  74.  
  75. nsorted = sort(nnumbers);
  76. nlukuja = length(nsorted)
  77. for i in 1 : nlukuja
  78. println(nsorted[i]," ",factor(nsorted[i]))
  79. end
  80. # poistetaan n-tuloslistan toistot
  81. # puhdistettu lista nlukujavalmis
  82. nlukujavalmis = Int64[nsorted[1]]
  83. for i in 1 : nlukuja-1
  84. if nsorted[i] != nsorted[i+1]
  85. push!(nlukujavalmis,nsorted[i+1])
  86. end
  87. end
  88. nlukuja_valmis = length(nlukujavalmis);
  89. # tulostetaan valmiiden lista
  90. for i in 1 : length(nlukujavalmis)
  91. println(i," ",nlukujavalmis[i]," ",factor(nlukujavalmis[i]))
  92. end
Advertisement
Add Comment
Please, Sign In to add comment