介绍
考虑以下过程:在某个底数b中取某个正整数n,并用右边数字底数中的表示替换每个数字。
- 如果右边的数字为0,请使用base b。
- 如果右边的数字是1,请使用带有0的一元符号作为计数标记。
- 如果右边没有数字(即您在那个位置),请循环到最高有效数字。
例如,让n = 160和b =10。运行该过程如下所示:
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.
也可以执行完全相同的过程,但向左移动而不是向右移动:
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.
因此,我们制作了两个与160相关的数字(对于b = 10):16和10000000。
如果将在此过程中生成的两个数字中的至少一个平均分为2个或更多部分,则将n定义为狡猾的数字
在此示例中,n之所以狡猾是因为160将10000000精确地除以62500次。
203并非很狡猾,因为得出的数字是2011和203本身,而203不能平均分配2次或多次。
挑战
(对于其余问题,我们将仅考虑b =10。)
面临的挑战是编写一个程序,该程序可以找到同样也是质数最高的狡猾数字。
前七个狡猾的素数(以及到目前为止我发现的所有素数)是:
2
5
3449
6287
7589
9397
93557 <-- highest so far (I've searched to 100,000,000+)
我官方不确定是否还会存在,但我希望它们确实存在。如果您能证明确实有(或没有)很多,我会给您+200赏金代表。
赢家将是能够提供最高技巧的人,只要他们显然一直在积极搜寻并且不故意从他人身上夺取荣耀。
规则
- 您可以使用任何所需的主要发现工具。
- 您可以使用概率质数测试仪。
- 您可以按署名重用其他人的代码。这是一项共同努力。绝不容忍残酷的战术。
- 您的程序必须积极搜索素数。您可以从已知的最高狡猾的质素开始搜索。
- 您的程序应该能够在Amazon EC2 t2.medium实例的四个小时内(一次四个或一个四个小时,或者介于两个小时之间)计算所有已知的狡猾素数。我实际上不会在它们上进行测试,您当然不需要。这只是一个基准。
这是我用于生成上表的Python 3代码:(在一两秒钟内运行)
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()