Вступ
Розглянемо процес взяття деякого додатного цілого числа 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, які 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()