소개
어떤 기수 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 배이다.
결과 숫자가 2011 년과 203 자체이기 때문에 203은 교묘하지 않습니다.
도전
(문제의 나머지 부분에서는 b = 10 만 고려할 것입니다 .)
문제는 또한 가장 높은 교활한 숫자를 찾는 프로그램을 작성하는 것입니다.
처음 7 가지 교묘 한 소수 (그리고 지금까지 찾은 모든 것)는 다음과 같습니다.
2
5
3449
6287
7589
9397
93557 <-- highest so far (I've searched to 100,000,000+)
나는 공식적으로 더 많은 것이 있는지 확실하지 않지만, 그들이 더있을 것으로 기대합니다. 당신이 유한하게 많은 (또는 그렇지 않은) 것을 증명할 수 있다면 나는 당신에게 +200 현상금 담당자를 줄 것입니다.
그들이 수색에 적극적이고 다른 사람들로부터 의도적으로 영광을 얻지 않는 것이 명백하다면, 승자는 가장 교묘 한 수상을 할 수있는 사람이 될 것입니다.
규칙
- 원하는 주요 도구를 사용할 수 있습니다.
- 확률 적 주요 테스터를 사용할 수 있습니다.
- 다른 사람 코드 를 저작자 표시로 재사용 할 수 있습니다 . 이것은 공동 노력입니다. 목구멍 전술은 용납되지 않습니다.
- 프로그램은 프라임을 적극적으로 검색해야합니다. 알려진 가장 교묘 한 프라임에서 검색을 시작할 수 있습니다.
- 프로그램은 Amazon EC2 t2.medium 인스턴스 4 시간 내에 (한 번에 4 개 또는 4 시간 동안 또는 그 사이에있는 것) 4 시간 내에 알려진 모든 교묘 한 소수 를 계산할 수 있어야합니다 . 나는 실제로 그것들을 테스트하지 않을 것이며 반드시 그럴 필요는 없습니다. 이것은 단지 벤치 마크 일뿐입니다.
위의 테이블을 생성하는 데 사용한 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()