ผู้ช่วยแยกตัวประกอบของแฟร์มาต์


19

เราต้องการที่จะ factorize semiprime Nเป้าหมายของการท้าทายนี้คือการหาจำนวนเต็มสองจำนวนขนาดเล็กUและvดังกล่าวว่ายูv Nสามารถ factorized นิด ๆ ด้วยวิธีการของแฟร์มาต์จึงอนุญาตให้หักค่าใช้จ่ายได้อย่างง่ายดายปัจจัยของNNuvuvNN

งาน

รับsemiprime และจำนวนเต็มบวกkเรานิยามxและyเป็น:Nkxy

y=x2-kN

x=kN
y=x2kN

ขั้นตอนที่ # 1 - ค้นหาk

ก่อนอื่นคุณต้องหาค่าที่เป็นไปได้ที่เล็กที่สุดของดังกล่าวว่าปีเป็นจำนวนตาราง ( akaตารางที่สมบูรณ์)ky

นี้จะช่วยให้ Factorize ด้วยซ้ำเดียวของวิธีการแยกตัวประกอบของแฟร์มาต์ ยิ่งเป็นรูปธรรมสิ่งนี้นำไปสู่:kN

kN=(x+y)×(xy)

(อัปเดต: ลำดับนี้เผยแพร่ในขณะนี้เป็นA316780 )

ขั้นตอนที่ # 2 - แยกตัวประกอบk

จากนั้นคุณต้องค้นหาจำนวนเต็มบวกทั้งสองตัวและvเช่นนั้น:uv

c u = x +

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

ที่และDเป็นปัจจัยที่สำคัญของNcdN

สรุป

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เป็นอินพุตและพิมพ์หรือส่งออกuและvในลำดับใด ๆ และรูปแบบที่เหมาะสมNuv

ตัวอย่าง

ลองพิจารณาN=199163

ขั้นตอนที่ 1

ค่าที่เล็กที่สุดที่เป็นไปได้ของคือ40ซึ่งให้: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

ขั้นตอนที่ 2

การแยกตัวประกอบที่ถูกต้องของคือk = 4 × 10เพราะ:kk=4×10

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

[4,10][10,4]

กฎระเบียบ

  • uv
  • uvN
  • อินพุตรับประกันว่าจะเป็น semiprime
  • นี่คือโค้ดกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

กรณีทดสอบ

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 ]

ตัวอย่างการนำไปใช้

fNuv

gNuvNO(1)


เรารับประกันได้หรือไม่ว่าข้อมูลNนั้นจะเป็นครึ่งปีหรือไม่?
เกร็กมาร์ติน

@ GregMartin ใช่คุณเป็น
Arnauld

คำตอบ:


8

Mathematica, 81 79 ไบต์

ขอบคุณ Martin Ender สำหรับการบันทึก 2 ไบต์!

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

ฟังก์ชั่น Pure รับ semiprime เป็นอินพุตและส่งคืนคู่ของจำนวนเต็มบวกที่สั่ง Forดำเนินห่วงขั้นตอนที่แน่นอนที่อธิบายไว้ในคำถาม (ใช้#สำหรับใส่ในสถานที่n) ด้วยxตามที่กำหนดไว้มีถึงแม้ว่าเราจะเก็บj = k*nแทนkตัวเองและz=Sqrt[y]แทนyตัวเอง นอกจากนี้เรายังคำนวณp={x+z,x-z}ภายในForลูปซึ่งสิ้นสุดการบันทึกหนึ่งไบต์ (เช่นเดียวกับการลองครั้งที่เจ็ด) จากนั้นทั้งสองปัจจัยที่ต้องการ(x+z)/GCD[#,x+z]และ(x-z)/GCD[#,x-z]ซึ่งการแสดงออกที่กระชับp/#~GCD~pคำนวณโดยตรงเป็นคู่ที่สั่งซื้อ

ความอยากรู้: เราต้องการวนซ้ำจนกว่าzจะเป็นจำนวนเต็ม; แต่เนื่องจากเรากำลังจะใช้Ceilingอยู่แล้วในรหัสที่มันจะช่วยประหยัดไบต์ที่สองมากกว่า!IntegerQ@zที่จะกำหนดc=Ceiling(ซึ่งค่าใช้จ่ายสี่ไบต์เป็นนักกอล์ฟ Mathematica รู้) c@z>zแล้วทดสอบว่า เราต้องเริ่มต้นzกับบางสิ่งบางอย่างและบางสิ่งที่ดีกว่าไม่ใช่จำนวนเต็มเพื่อให้ลูปเริ่มต้นได้ โชคดีที่Eเป็นทางเลือกที่กระชับ


4

JavaScript (ES7), 86 81 ไบต์

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)

แก้ไข: บันทึกแล้ว 4 ไบต์ขอบคุณ @Arnauld


4

Python 2, 127 121 117 111 107 104 101 99 ไบต์

-1 ไบต์ต้องขอบคุณ Neil และ -3 ไบต์ขอบคุณ 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

ลองออนไลน์!

วิทยากร:

pถูกเตรียมใช้งานเพื่อ.5ให้เงื่อนไขลูปจะเป็นจริงในการวนซ้ำครั้งแรก โปรดทราบว่ามันจะสั้นกว่าในการจัดเก็บp(เป็นx+ sqrt(y)) กว่าที่จะเก็บแต่ละxและyแยก


x*xแทนx**2?
Neil

@ Neil ใช่แน่นอน ขอบคุณ
คณิตศาสตร์ junkie

1

ความจริง131 115 ไบต์

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])

ฟังก์ชั่นที่จะแก้ไขคำถามคือ r (n) ด้านบน ungolf และทดสอบ

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.