(Bỏ qua 44 vẫn là 44.) Cảm ơn Fireflame241 vì đã tiết kiệm một byte!
P=input();i=P/3
while i*10%P-1:i-=1
print i
Hãy thử trực tuyến!
Có chính xác một số giữa 0và P-1đó là một số nghịch đảo 10. Nhưng nếu nghịch đảo đó uxảy ra lớn hơn P/2, thì đó (u-P)cũng là nghịch đảo và có giá trị tuyệt đối nhỏ hơn u. Vì vậy, hóa ra chúng ta thực sự đang tìm kiếm số duy nhất xgiữa -P/2và P/2đó là số nghịch đảo 10.
Đoạn mã trên thực hiện chính xác điều đó, bắt đầu từ (tầng của) P/2và bước xuống dưới cho đến khi đạt được nghịch đảo. Điều này phải xảy ra đối với một số số lớn hơn -P/2miễn Plà số nguyên tố lớn hơn 10. Chính xác hơn, nó sẽ chấm dứt nếu và chỉ khi Plà đồng thời 10.
Chỉnh sửa: Thực tế hóa ra xlà được đảm bảo ở giữa -P/3và P/3, vì vậy phiên bản hiện tại bắt đầu từ P/3và bước xuống từ đó. Xem phần có nhãn Giới hạn được cải thiện để biết giải thích về điều này.
Giải thích toán học
Nó không rõ ràng ngay lập tức với tôi tại sao thử nghiệm phân chia hoạt động. Đây là một lời giải thích, trong trường hợp bất cứ ai khác đang tự hỏi.
Hãy Plà một số nguyên tố, lớn hơn 10, có chữ số cuối cùng b. Như vậy
P = 10a + b
ở đâu a > 0, và 0 <= b < 10. Trong thực tế blà một trong hai 1, 3, 7, hoặc 9, bởi vì một lớn hơn thủ hơn 10phải kết thúc bằng một trong các chữ số.
Bây giờ giả sử bx + a = 0 (mod P). Sau đó
a = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
Vì Plà số nguyên tố, các số nguyên mod Plà một miền tích phân . Vì vậy, hoặc b = 0 (mod P), hoặc 1 - 10x = 0 (mod P).
Chúng tôi biết 0 <= b < 10 < P, vì vậy nếu b = 0 (mod P)sau đó b = 0. Nhưng chúng tôi đã nói bđược một trong hai 1, 3, 7, hoặc 9, vì vậy đây là không thể. Do đó 1 - 10x = 0 (mod P), vì vậy 10x = 1 (mod P). Nói cách khác, xlà nghịch đảo của 10modulo P.
Bây giờ giả sử Nlà một số nguyên không âm có chữ số cuối cùng d, vì vậy N = 10c + d. chúng tôi có một chuỗi các câu lệnh tương đương:
10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED.
Hữu ích?
Tôi cũng đã tự hỏi liệu thử nghiệm chia hết (được đưa ra N = 10c + d, thay thế Nbằng dx + c) có thực sự hiệu quả trong thực tế hay không. Hoặc ít nhất, nó có đáng tin cậy thay thế Nbằng một số nhỏ hơn N(về giá trị tuyệt đối) không?
Giả sử N = 10c + d, ở đâu c >= 0và 0 <= d < 10. Do đó 10c = N - d <= N. Theo bất đẳng thức tam giác,
|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
Như vậy 5P <= 9N/10, nếu , sau đó |c + dx| < N.
Đặc biệt, nếu N >= 6P, sau đó |c + dx| < N. Như vậy, cho Pchúng ta bắt đầu bằng cách tính toán 2P, 3P, ..., 6P, cùng với x. Sau đó, cho N, chúng tôi chạy thử nghiệm chia hết liên tục cho đến khi chúng ta đạt được một số nhỏ hơn hoặc bằng đến 6P, và kiểm tra xem kết quả là bất kỳ con số 0, P, 2P, ..., 6P.
(Tất nhiên, bất cứ khi nào chúng ta đạt đến một số âm, chúng ta sẽ thay thế nó bằng giá trị tuyệt đối của nó, điều này là tốt vì qnó chia hết cho Pkhi và chỉ khi (-q)là.)
Giới hạn được cải thiện
Tôi nhận thấy rằng |x|/Pdường như không bao giờ gần gũi 1/2. Trên thực tế, có vẻ như nó luôn nhỏ hơn 1/3... hoặc khi kiểm tra kỹ hơn, nó luôn ở rất gần 1/10hoặc3/10 . Lớn nhất nó từng có vẻ là 4/13(xảy ra khi P=13và x=4). Tại sao điều này sẽ được?
Hãy ulà một số nguyên và giả sử rằng 10u = kP + 1đối với một số nguyên k, uthì nghịch đảo của 10modulo P. Sau đó, chúng ta cũng biết rằng ktương đối chính10 , vì k(-P)tương đương với 1modulo 10.
Bây giờ, chúng ta biết rằng tất cả các nghịch đảo của 10modulo Pđều khác nhau theo bội số P, vì vậy chúng ta có thể lấy số nguyên uvà cộng hoặc trừ bội số của Pý chí, và kết quả sẽ luôn là nghịch đảo của 10modulo P. Giả sử chúng ta chọn để trừ Ptừ u: chúng tôi nhận
10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Nói cách khác, giảm (tương ứng, tăng) ubởi Ptương ứng với giảm (tăng) kbởi 10. Chúng tôi muốn thêm / bớt bội số củaP từ ucho đến khi phía bên trái tay được giảm thiểu về giá trị tuyệt đối; nhưng phía bên trái tay được giảm thiểu một cách chính xác khi phía bên tay phải được giảm thiểu, và vì vậy chúng tôi muốn thêm / bớt 10từ kcho đến khi phía bên tay phải được giảm thiểu về giá trị tuyệt đối.
Nhưng chúng ta biết rằng điều này sẽ xảy ra khi klà giữa -5và 5, và do đó (vì klà tố cùng nhau với 10) phương tiện này klà một trong hai -3, -1,1 , hoặc 3. (Đây là nội dung bình luận của @ Neil trong OP. Cảm ơn, Neil! )
Vì vậy khi |u|được giảm thiểu (ví dụ u=x), chúng tôi sẽ có x/P = u/P = k/10 + 1/(10P), nơi klà một trong hai -3, -1, 1, hoặc3 . Do đó |x|/P <= 3/10 + 1/(10P). Tương đương , |x| <= (3P + 1)/10.
Hơn nữa, sự bất bình đẳng này là nghiêm ngặt tại P=11, bởi vì tại P=11chúng ta có x=-1và k=-1. Nhỏ nhấtP mà bình đẳng giữ là P=13(ở đâu x=4và k=3).
Do đó, số tiền lớn nhất |x|/Ptừng có là 3/10 + 1/(10*13)bởi vì đây P=13là số nguyên tố đầu tiên mà chúng ta có k=3và trong số đó có k=3số hạng 1/(10P)lớn nhất khi Pnhỏ nhất (ví dụ: tại P=13). Do đó, đối với tất cả P, chúng ta cũng có |x|/P <= 3/10 + 1/130 = 4/13 < 1/3. Điều này giải thích tại sao trong đoạn mã trên chúng ta có thể khởi tạo i = P/3thay vì phải bắt đầu tại P/2.
Hơn nữa, các giới hạn trong phần Hữu ích ở trên có thể được cải thiện.
Bổ đề : Hãy để N = 10c + dnơi c > 0và 0 <= d <= 9. Sau đó c + d|x| < N/10 + 9(3P + 1)/10. (Lưu ý sự bất bình đẳng nghiêm ngặt.)
Bằng chứng bổ đề: bằng các trường hợp. Trường hợp I : d = 0, vì vậy N = 10c. Sau đó c + d|x| = c = N/10 < N/10 + 9(3P + 1)/10.
Trường hợp II : 0 < d <= 9. Sau đó10c = N - d < N , vì vậy c < N/10. Do đó c + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10. QED.
Như vậy, nếu N > 3P(và N = 10c + dnhư trước), thì
3P + 1 <= N
9(3P + 1)/10 <= 9N/10
N/10 + 9(3P + 1)/10 <= N
c + d|x| < N/10 + 9(3P + 1)/10 <= N
Vì thế nếu N > 3P sau đó c + d|x| < N.
Do đó, chúng ta chỉ phải tìm P, 2Pvà 3P, cùng với x. Cho N > 0, trong khi N > 3P, chúng tôi thay thế Nbởi |c + dx|, mà giảm N. Cuối cùng, chúng tôi sẽ nhận được N <= 3P; tại thời điểm đó, chúng tôi dừng lại và kiểm tra xem Nlà tương đương với bất kỳ con số 0, P,2P , hoặc 3P.
Chúng ta không thể làm tốt hơn 3Pnói chung. Ví dụ, giả sử P = 13và N = 39, vì vậy x = 4. Sau đó thay thế Nbằng dx + c = 9(4) + 3lá Nkhông đổi.
xgiá trị nhỏ nhất tuyệt đối trong đó10*x-1chia hết cho đầu vào.