Intro
พิจารณากระบวนการรับจำนวนเต็มบวกnในบางฐานbและแทนที่แต่ละหลักด้วยการเป็นตัวแทนในฐานของตัวเลขไปทางขวา
- ถ้าหลักไปทางขวาเป็น 0 ใช้ฐานข
- ถ้าหลักไปทางขวาเป็น 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 และ 10,000000
เราจะกำหนด n ให้เป็นจำนวนที่มีฝีมือหากแบ่งเท่า ๆ กันอย่างน้อยหนึ่งในสองตัวเลขที่สร้างในกระบวนการนี้ออกเป็น 2 ส่วนหรือมากกว่า
ในตัวอย่างnเป็นเจ้าเล่ห์เพราะ 160 หาร 10,000000 อย่างแน่นอน 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()