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 .
Tugas
Diberikan semiprime dan bilangan bulat positif k , kami mendefinisikan x dan y sebagai:
y=x2-kN
Langkah # 1 - Temukan
Pertama-tama Anda perlu menemukan nilai terkecil yang mungkin sehingga y adalah bilangan kuadrat ( alias kuadrat sempurna).
Ini memungkinkan untuk membuat faktor dengan satu iterasi tunggal dari metode faktorisasi Fermat . Lebih konkret, ini segera mengarah ke:
(Pembaruan: urutan ini sekarang diterbitkan sebagai A316780 )
Langkah # 2 - Memfaktorkan
Anda kemudian harus menemukan dua bilangan bulat positif dan v sedemikian rupa sehingga:
c u = x + √
di mana dan d adalah faktor prima dari N .
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.
Contoh
Mari kita pertimbangkan
Langkah 1
Nilai terkecil yang mungkin adalah 40 , yang memberikan:
y=28232-40×199163=7969329-7966520=2809=532kN=(2823+53)×(2823-53)kN=2876×2770
Langkah 2
Faktorisasi adalah k = 4 × 10 , karena:
Aturan
- 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
.
sumber
N
sebenarnya berupa semiprime?Jawaban:
Mathematica,
8179 byteTerima kasih kepada Martin Ender karena telah menghemat 2 byte!
Fungsi murni mengambil semiprime sebagai input dan mengembalikan sepasang bilangan bulat positif yang dipesan. The
For
Loop alat prosedur yang tepat dijelaskan dalam pertanyaan (menggunakan#
untuk input di tempatn
), denganx
seperti yang didefinisikan di sana, meskipun kita menyimpanj = k*n
bukannyak
itu sendiri danz=Sqrt[y]
bukany
dirinya sendiri. Kami juga menghitungp={x+z,x-z}
di dalamFor
loop, 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 ekspresip/#~GCD~p
ringkasnya menghitung secara langsung sebagai pasangan berurutan.Keingintahuan: kami ingin mengulang sampai
z
bilangan bulat; tetapi karena kita akan menggunakanCeiling
sudah dalam kode, menghemat dua byte lebih!IntegerQ@z
untuk mendefinisikanc=Ceiling
(yang harganya empat byte, seperti pegolf Mathematica tahu) dan kemudian menguji apakahc@z>z
. Kita harus menginisialisasiz
sesuatu, dan sesuatu itu sebaiknya tidak menjadi bilangan bulat sehingga loop dapat dimulai; Untungnya,E
ini adalah pilihan yang ringkas.sumber
JavaScript (ES7),
8681 byteSunting: Disimpan 4 byte berkat @Arnauld.
sumber
Python 2,
12712111711110710410199 byte-1 byte terima kasih kepada Neil & -3 byte terima kasih untuk ovs
Cobalah secara Online!
Keingintahuan:
p
diinisialisasi.5
sehingga kondisi loop akan benar pada iterasi pertama. Perhatikan bahwa lebih pendek untuk menyimpanp
(sebagaix
+sqrt(y)
) daripada untuk menyimpan masing-masingx
dany
secara terpisah.sumber
x*x
bukanx**2
?Aksioma,
131115 byteFungsi yang akan menyelesaikan pertanyaan adalah r (n) di atas. ungolf dan tes
sumber