вступление
Рассмотрим процесс взятия некоторого положительного целого числа n в некоторой базе b и замены каждой цифры ее представлением в основании цифры справа.
- Если цифра справа - 0, используйте основание 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.
Мы определим n как хитрое число, если оно равномерно делит хотя бы одно из двух чисел, сгенерированных в этом процессе, на 2 или более частей.
В примере n хитроумно, потому что 160 делит 10000000 ровно 62500 раз.
203 НЕ является хитрым, потому что итоговые числа - это 2011 и 203, которые не могут равномерно вписываться в 2 или более раз.
Вызов
(Для остальной части проблемы мы рассмотрим только b = 10.)
Задача состоит в том, чтобы написать программу, которая находит наибольшее хитрое число, которое также является простым.
Первые 7 хитроумных простых чисел (и все, что я нашел до сих пор):
2
5
3449
6287
7589
9397
93557 <-- highest so far (I've searched to 100,000,000+)
Официально я не уверен, существуют ли еще, но я ожидаю, что они существуют. Если вы можете доказать, что их конечное число (или их нет), я дам вам +200 повторений.
Победителем станет тот, кто сможет обеспечить наивысшую хитрость, при условии, что очевидно, что они были активны в поиске и преднамеренно не снискали славу у других.
правила
- Вы можете использовать любые удобные инструменты поиска.
- Вы можете использовать вероятностные простые тестеры.
- Вы можете повторно использовать код других людей с указанием авторства . Это совместное усилие. Тактика головокружения недопустима.
- Ваша программа должна активно искать премьер. Вы можете начать поиск с самого высокого известного хитрого прайма.
- Ваша программа должна быть в состоянии вычислить все известные хитрые простые числа в течение 4 часов после экземпляров 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()