Penolong faktorisasi Fermat


19

Kami ingin pd sebuah semiprime . Tujuan dari tantangan ini adalah untuk menemukan dua bilangan bulat kecil u dan v sehingga u v N dapat sepele difaktorkan dengan metode Fermat, sehingga memungkinkan untuk dengan mudah mengurangi faktor-faktor N .NuvuvNN

Tugas

Diberikan semiprime dan bilangan bulat positif k , kami mendefinisikan x dan y sebagai:Nkxy

y=x2-kN

x=kN
y=x2kN

Langkah # 1 - Temukan k

Pertama-tama Anda perlu menemukan nilai terkecil yang mungkin sehingga y adalah bilangan kuadrat (ky alias kuadrat sempurna).

Ini memungkinkan untuk membuat faktor dengan satu iterasi tunggal dari metode faktorisasi Fermat . Lebih konkret, ini segera mengarah ke:kN

kN=(x+y)×(xy)

(Pembaruan: urutan ini sekarang diterbitkan sebagai A316780 )

Langkah # 2 - Memfaktorkan k

Anda kemudian harus menemukan dua bilangan bulat positif dan v sedemikian rupa sehingga:uv

c u = x +

uv=k
dv=x-
cu=x+y
dv=xy

di mana dan d adalah faktor prima dari N .cdN

Ringkasan

Tugas Anda adalah menulis sebuah program atau fungsi yang mengambil sebagai input dan cetakan atau keluaran u dan v dalam urutan apa pun dan format apa pun yang wajar.Nuv

Contoh

Mari kita pertimbangkan N=199163

Langkah 1

Nilai terkecil yang mungkin adalah 40 , yang memberikan:k40

y=28232-40×199163=7969329-7966520=2809=532kN=(2823+53)×(2823-53)kN=2876×2770

x=(40×199163)=2823
y=2823240×199163=79693297966520=2809=532
kN=(2823+53)×(282353)
kN=2876×2770

Langkah 2

Faktorisasi adalah k = 4 × 10 , karena:kk=4×10

kN=2876×2770
kN=(719×4)×(277×10)
N=719×277

[4,10][10,4]

Aturan

  • uv
  • uvN sampai dengan ukuran maksimum asli unsigned integer dalam bahasa Anda.
  • Masukan dijamin semiprime.
  • Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang.
  • Celah standar dilarang.

Uji kasus

N          | k    | Output
-----------+------+------------
143        | 1    | [   1,  1 ]
2519       | 19   | [   1, 19 ]
199163     | 40   | [   4, 10 ]
660713     | 1    | [   1,  1 ]
4690243    | 45   | [   9,  5 ]
11755703   | 80   | [  40,  2 ]
35021027   | 287  | [   7, 41 ]
75450611   | 429  | [ 143,  3 ]
806373439  | 176  | [   8, 22 ]
1355814601 | 561  | [  17, 33 ]
3626291857 | 77   | [   7, 11 ]
6149223463 | 255  | [  17, 15 ]
6330897721 | 3256 | [  74, 44 ]

Contoh implementasi

fNuv .

gNuvNO(1)


Apakah kami dijamin bahwa inputnya Nsebenarnya berupa semiprime?
Greg Martin

@Regregin Ya Anda.
Arnauld

Jawaban:


8

Mathematica, 81 79 byte

Terima kasih kepada Martin Ender karena telah menghemat 2 byte!

(c=Ceiling;For[j=0;z=E,c@z>z,p=(x=c@Sqrt[j+=#])+{z=Sqrt[x^2-j],-z}];p/#~GCD~p)&

Fungsi murni mengambil semiprime sebagai input dan mengembalikan sepasang bilangan bulat positif yang dipesan. The ForLoop alat prosedur yang tepat dijelaskan dalam pertanyaan (menggunakan #untuk input di tempat n), dengan xseperti yang didefinisikan di sana, meskipun kita menyimpan j = k*nbukannya kitu sendiri dan z=Sqrt[y]bukan ydirinya sendiri. Kami juga menghitung p={x+z,x-z}di dalam Forloop, yang akhirnya menghemat satu byte (seperti percobaan ketujuh). Kemudian dua faktor yang diinginkan adalah (x+z)/GCD[#,x+z]dan (x-z)/GCD[#,x-z], yang ekspresi p/#~GCD~pringkasnya menghitung secara langsung sebagai pasangan berurutan.

Keingintahuan: kami ingin mengulang sampai zbilangan bulat; tetapi karena kita akan menggunakan Ceilingsudah dalam kode, menghemat dua byte lebih !IntegerQ@zuntuk mendefinisikan c=Ceiling(yang harganya empat byte, seperti pegolf Mathematica tahu) dan kemudian menguji apakah c@z>z. Kita harus menginisialisasi zsesuatu, dan sesuatu itu sebaiknya tidak menjadi bilangan bulat sehingga loop dapat dimulai; Untungnya, Eini adalah pilihan yang ringkas.


4

JavaScript (ES7), 86 81 byte

n=>(g=k=>(y=(n*k)**.5+1|0,y+=(y*y-n*k)**.5)%1?g(k+1):n*u++%y?g(k):[--u,k/u])(u=1)

Sunting: Disimpan 4 byte berkat @Arnauld.


4

Python 2, 127 121 117 111 107 104 101 99 byte

-1 byte terima kasih kepada Neil & -3 byte terima kasih untuk ovs

N=input()
k=u=1;p=m=.5
while p%1:p=1+(k*N)**m//1;p+=(p*p-k*N)**m;k+=1
while N*u%p:u+=1
print~-k/u,u

Cobalah secara Online!

Keingintahuan:

pdiinisialisasi .5sehingga kondisi loop akan benar pada iterasi pertama. Perhatikan bahwa lebih pendek untuk menyimpan p(sebagai x+ sqrt(y)) daripada untuk menyimpan masing-masing xdan ysecara terpisah.


x*xbukan x**2?
Neil

@Neil Ya, tentu saja. Terima kasih
pecandu matematika

1

Aksioma, 131 115 byte

v(x)==floor(x^.5)::INT;r(n)==(k:=0;repeat(k:=k+1;x:=1+v(k*n);y:=v(x*x-k*n);x^2-y^2=k*n=>break);[w:=gcd(k,x+y),k/w])

Fungsi yang akan menyelesaikan pertanyaan adalah r (n) di atas. ungolf dan tes

vv(x)==floor(x^.5)::INT    

--(x-y)*(x+y)=k*n
rr(n)==
  k:=0
  repeat
     k:=k+1
     x:=1+vv(k*n)
     y:=vv(x*x-k*n)
     x^2-y^2=k*n=>break
  [w:=gcd(k,x+y),k/w]


(4) -> [[i,r(i)] for i in [143,2519,199163,660713,4690243,11755703]]
   (4)
   [[143,[1,1]], [2519,[1,19]], [199163,[4,10]], [660713,[1,1]],
    [4690243,[9,5]], [11755703,[40,2]]]
                                                      Type: List List Any
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.