jukaukor

Kongruenssiyhtalo3.jl

May 26th, 2020
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 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.  
  28. #b= primes(1,1000000);
  29. b = primes(1,100000000);
  30. maksimi = length(b);
  31. # multiplicative order of 2 modulo primes
  32.  
  33.  
  34. function sopivat_alkuluvut(maksimi)
  35. properprimes = Int64[] # kongruenssiyhtälölle kelvolliset kanditaatit
  36. multord = Int64[] # kelvollisten multiplicative order of 2
  37. # multorder(2,p) pariton, p jaettuna 8:lla antaa jakojäännöksen 1 tai 7
  38. s = 0
  39. for i in 2 : maksimi
  40. #if multorder(2,b[i]) % 2 != 0 && (b[i] % 8 == 1 || b[i] % 8 == 7)
  41. temp1 = b[i] % 8
  42. if temp1 == 1 || temp1 == 7
  43. temp2 = multorder(2,b[i])
  44. if temp2 % 2 != 0
  45. s += 1
  46. push!(properprimes,b[i])
  47. push!(multord,temp2)
  48. end
  49. end
  50. end
  51. println("sopivia alkulukuja oli ",s)
  52. return properprimes,multord
  53. end
  54. # testaan kelvollisilla alkulukukanditaateilla p kongruenssiyhtälö
  55. # testataan n = q*p =(k*ord(2,p))+2)*p yhtälölle 2^(n-2) = 1 (mod n)
  56. properprimes,multord = sopivat_alkuluvut(maksimi);
  57. nnumbers = Int64[]
  58. nmaxproper =length(properprimes)
  59. half1 = div(nmaxproper,2)+1 # alkulukujen puoliväli
  60. half2 = half1-1 # toinen puolisko
  61. # lasketaan ensin suurimpien alkulukutekiojöiden avulla
  62. # näin saadaan sisäsilmukan k:t pieniksi
  63. for i in nmaxproper : -1 : half1 # aloitetaan suurimmista alkuluvuista
  64. mult = multord[i]
  65. for k in 1 : 2: 10000
  66. n = (k*mult+2)*properprimes[i]
  67. if powermod(2,n-2,n)==1
  68. #println(n," factors: ",factor(n))
  69. push!(nnumbers,n)
  70. end
  71. end
  72. end
  73. for i in half2 : -1 : 1 # jatketaan puolivalista alkuun
  74. mult = multord[i]
  75. for k in 1 : 2: 10000
  76. n = (k*mult+2)*properprimes[i]
  77. if powermod(2,n-2,n)==1
  78. #println(n," factors: ",factor(n))
  79. push!(nnumbers,n)
  80. end
  81. end
  82. end
  83.  
  84. nsorted = sort(nnumbers);
  85. nlukuja = length(nsorted)
  86.  
  87. # poistetaan n-tuloslistan toistot
  88. # puhdistettu lista nlukujavalmis
  89. nlukujavalmis = Int64[nsorted[1]]
  90. for i in 1 : nlukuja-1
  91. if nsorted[i] != nsorted[i+1]
  92. push!(nlukujavalmis,nsorted[i+1])
  93. end
  94. end
  95. nlukuja_valmis = length(nlukujavalmis);
  96. # tulostetaan valmiiden lista
  97. for i in 1 : length(nlukujavalmis)
  98. println(i," ",nlukujavalmis[i]," ",factor(nlukujavalmis[i]))
  99. end
Advertisement
Add Comment
Please, Sign In to add comment