Người trợ giúp nhân tố của Fermat


19

Chúng tôi muốn factorize một số nửa nguyên tố . Mục tiêu của thử thách này là để tìm hai số nguyên nhỏ và mà có thể được trivially factorized với phương pháp Fermat, do đó cho phép dễ dàng trích các yếu tố của .NuvuvNN

Nhiệm vụ

Cho một bán cầu và một số nguyên dương , chúng tôi xác định và là:Nkxy

x=kN
y=x2kN

Bước # 1 - Tìmk

Trước tiên bạn cần tìm giá trị nhỏ nhất có thể của sao cho là một số vuông ( hay còn gọi là hình vuông hoàn hảo).ky

Điều này cho phép nhân tố với một lần lặp duy nhất của phương pháp nhân tố hóa Fermat . Cụ thể hơn, điều này ngay lập tức dẫn đến:kN

kN=(x+y)×(xy)

(Cập nhật: trình tự này hiện được xuất bản dưới dạng A316780 )

Bước # 2 - Hệ số hóak

Sau đó, bạn phải tìm hai số nguyên dương và sao cho:vuv

c u = x +

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

nơi d là những yếu tố chính của N .cdN

Tóm lược

Nhiệm vụ của bạn là viết một chương trình hoặc hàm lấy làm đầu vào và in hoặc xuất uv theo bất kỳ thứ tự và bất kỳ định dạng hợp lý nào.Nbạnv

Thí dụ

Hãy xem xét N= =199163

Bước 1

Giá trị nhỏ nhất có thể có của 40 , cho:k40

y=28232-40×199.163=7.969.329-7.966.520=2809=532kN=(2823+53)×(2823-53)kN=2876×2770

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

Bước 2

Hệ số chính xác của k = 4 × 10 , bởi vì:kk= =4×10

k N = ( 719 × 4 ) × ( 277 × 10 ) N = 719 × 277

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

Vì vậy, câu trả lời đúng sẽ là hoặc [ 10 , 4 ] .[4,10][10,4]

Quy tắc

  • Không bắt buộc phải áp dụng nghiêm ngặt hai bước được mô tả ở trên. Bạn có thể sử dụng bất kỳ phương pháp nào khác, miễn là nó tìm thấy các giá trị chính xác của v .bạnv
  • bạnvN
  • Đầu vào được đảm bảo là một bán kết.
  • Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.
  • Sơ hở tiêu chuẩn bị cấm.

Các trường hợp thử nghiệm

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 ]

Ví dụ thực hiện

fNbạnv

gNbạnvNÔi(1)


Chúng tôi có đảm bảo rằng đầu vào Ntrong thực tế sẽ là một bán kết không?
Greg Martin

@GregMartin Có bạn đây.
Arnauld

Câu trả lời:


8

Toán học, 81 79 byte

Cảm ơn Martin Ender đã tiết kiệm 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)&

Hàm thuần túy lấy một bán kết làm đầu vào và trả về một cặp số nguyên dương có thứ tự. Các Fordụng cụ loop thủ tục chính xác mô tả trong câu hỏi (sử dụng #cho đầu vào thay n), với xquy định ở đó, mặc dù chúng tôi lưu trữ j = k*nthay vì kbản thân và z=Sqrt[y]thay vì ychính nó. Chúng tôi cũng tính toán p={x+z,x-z}bên trong Forvòng lặp, kết thúc việc lưu một byte (giống như lần thử thứ bảy). Sau đó, hai yếu tố mong muốn là (x+z)/GCD[#,x+z](x-z)/GCD[#,x-z], biểu thức súc tích p/#~GCD~ptính trực tiếp như một cặp theo thứ tự.

Tò mò: chúng tôi muốn lặp cho đến khi zlà một số nguyên; nhưng vì chúng ta sẽ sử dụng Ceilingđã có trong mã, nên nó tiết kiệm được hai byte !IntegerQ@zđể xác định c=Ceiling(chi phí là bốn byte, như những người chơi golf Mathicala biết) và sau đó kiểm tra xem c@z>z. Chúng ta phải khởi tạo zmột cái gì đó, và cái gì đó tốt hơn không phải là một số nguyên để vòng lặp có thể bắt đầu; may mắn thay, Elà một lựa chọn súc tích.


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)

Chỉnh sửa: Đã lưu 4 byte nhờ @Arnauld.


4

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

-1 byte nhờ Neil & -3 byte nhờ vào 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

Hãy thử trực tuyến!

Tò mò:

pđược khởi tạo để .5điều kiện vòng lặp sẽ đúng trong lần lặp đầu tiên. Lưu ý rằng lưu trữ p(as x+ sqrt(y)) ngắn hơn so với lưu trữ từng xyriêng biệt.


x*xthay vì x**2?
Neil

@Neil Vâng, tất nhiên. Cảm ơn
nghiện toán học

1

Tiên đề, 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])

Hàm giải quyết câu hỏi là r (n) ở trên. ungolf và kiểm tra

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.