Giới thiệu
Xem xét quá trình lấy một số nguyên dương n trong một số cơ sở b và thay thế mỗi chữ số bằng biểu diễn của nó trong cơ sở của chữ số ở bên phải.
- Nếu chữ số bên phải là 0, sử dụng cơ sở b .
- Nếu chữ số bên phải là 1, hãy sử dụng unary với 0 là dấu kiểm đếm.
- Nếu không có chữ số ở bên phải (tức là bạn đang ở vị trí của những người đó), hãy vòng qua đến chữ số có ý nghĩa nhất.
Để làm ví dụ, hãy n = 160 và b = 10. Chạy quy trình như sau:
The first digit is 1, the digit to the right is 6, 1 in base 6 is 1.
The next digit is 6, the digit to the right is 0, 0 is not a base so use b, 6 in base b is 6.
The last digit is 0, the digit to the right (looping around) is 1, 0 in base 1 is the empty string (but that's ok).
Concatenating '1', '6', and '' together gives 16, which is read in the original base b = 10.
Thủ tục chính xác tương tự nhưng di chuyển sang trái thay vì phải cũng có thể được thực hiện:
The first digit is 1, the digit to the left (looping around) is 0, 0 is not a base so use b, 1 in base b is 1.
The next digit is 6, the digit to the left is 1, 6 in base 1 is 000000.
The last digit is 0, the digit to the left is 6, 0 in base 6 is 0.
Concatenating '1', '000000', and '0' together gives 10000000, which is read in the original base b = 10.
Do đó, chúng tôi đã thực hiện hai số liên quan đến 160 (cho b = 10): 16 và 10000000.
Chúng tôi sẽ định nghĩa n là một số xảo quyệt nếu nó chia đều ít nhất một trong hai số được tạo trong quy trình này thành 2 hoặc nhiều phần
Trong ví dụ n là xảo quyệt vì 160 chia 10000000 chính xác 62500 lần.
203 là không xảo quyệt vì các số kết quả là 2011 và 203, mà 203 không thể đồng đều thành 2 lần trở lên.
Thử thách
(Đối với phần còn lại của vấn đề, chúng tôi sẽ chỉ xem xét b = 10.)
Thách thức là viết một chương trình tìm ra con số xảo quyệt nhất cũng là số nguyên tố.
7 số nguyên tố đầu tiên xảo quyệt (và tất cả những gì tôi tìm thấy cho đến nay) là:
2
5
3449
6287
7589
9397
93557 <-- highest so far (I've searched to 100,000,000+)
Tôi không chính thức chắc chắn liệu có tồn tại nhiều hơn không, nhưng tôi mong họ làm được. Nếu bạn có thể chứng minh rằng có (hoặc không) nhiều thì tôi sẽ cung cấp cho bạn hơn 200 tiền thưởng.
Người chiến thắng sẽ là người có thể cung cấp số nguyên tố xảo quyệt cao nhất, với điều kiện là rõ ràng rằng họ đã tích cực trong việc tìm kiếm và không cố ý lấy vinh quang từ người khác.
Quy tắc
- Bạn có thể sử dụng bất kỳ công cụ tìm kiếm chính nào bạn muốn.
- Bạn có thể sử dụng thử nghiệm nguyên tố xác suất.
- Bạn có thể sử dụng lại mã người khác với sự ghi nhận . Đây là một nỗ lực chung. Chiến thuật cắt cổ sẽ không được dung thứ.
- Chương trình của bạn phải tích cực tìm kiếm nguyên tố. Bạn có thể bắt đầu tìm kiếm của bạn tại thủ tướng xảo quyệt được biết đến cao nhất.
- Chương trình của bạn sẽ có thể tính toán tất cả các số nguyên tố xảo quyệt đã biết trong vòng 4 giờ của các phiên bản Amazon EC2 t2.medium (bốn lần một hoặc một trong bốn giờ hoặc một cái gì đó ở giữa). Tôi sẽ không thực sự thử nghiệm nó trên chúng và bạn chắc chắn không cần phải làm vậy. Đây chỉ là một điểm chuẩn.
Đây là mã Python 3 của tôi mà tôi đã sử dụng để tạo bảng ở trên: (chạy trong một hoặc hai giây)
import pyprimes
def toBase(base, digit):
a = [
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
['', '0', '00', '000', '0000', '00000', '000000', '0000000', '00000000', '000000000' ],
['0', '1', '10', '11', '100', '101', '110', '111', '1000', '1001'],
['0', '1', '2', '10', '11', '12', '20', '21', '22', '100'],
['0', '1', '2', '3', '10', '11', '12', '13', '20', '21'],
['0', '1', '2', '3', '4', '10', '11', '12', '13', '14'],
['0', '1', '2', '3', '4', '5', '10', '11', '12', '13'],
['0', '1', '2', '3', '4', '5', '6', '10', '11', '12'],
['0', '1', '2', '3', '4', '5', '6', '7', '10', '11'],
['0', '1', '2', '3', '4', '5', '6', '7', '8', '10']
]
return a[base][digit]
def getCrafty(start=1, stop=100000):
for p in pyprimes.primes_above(start):
s = str(p)
left = right = ''
for i in range(len(s)):
digit = int(s[i])
left += toBase(int(s[i - 1]), digit)
right += toBase(int(s[0 if i + 1 == len(s) else i + 1]), digit)
left = int(left)
right = int(right)
if (left % p == 0 and left // p >= 2) or (right % p == 0 and right // p >= 2):
print(p, left, right)
if p >= stop:
break
print('DONE')
getCrafty()