Intro
Pertimbangkan proses mengambil bilangan bulat positif n di beberapa basis b dan mengganti setiap digit dengan perwakilannya di dasar digit di sebelah kanan.
- Jika digit di sebelah kanan adalah 0, gunakan basis b .
- Jika digit di sebelah kanan adalah 1, gunakan unary dengan 0 sebagai tanda penghitungan.
- Jika tidak ada digit di sebelah kanan (yaitu Anda berada di tempat yang), lilitkan ke digit yang paling signifikan.
Sebagai contoh, mari n = 160 dan b = 10. Menjalankan prosesnya terlihat seperti ini:
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.
Prosedur yang persis sama tetapi bergerak ke kiri dan bukan ke kanan juga dapat dilakukan:
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.
Dengan demikian, kami telah membuat dua angka yang terkait dengan 160 (untuk b = 10): 16 dan 10.000000.
Kami akan mendefinisikan n sebagai angka yang licik jika membagi secara merata setidaknya satu dari dua angka yang dihasilkan dalam proses ini menjadi 2 atau lebih bagian
Dalam contoh n adalah licik karena 160 membagi 10.000.000 persis 62500 kali.
203 BUKAN licik karena angka yang dihasilkan adalah 2011 dan 203 itu sendiri, yang 203 tidak bisa masuk secara merata menjadi 2 atau lebih kali.
Tantangan
(Untuk sisa masalah, kami hanya akan mempertimbangkan b = 10.)
Tantangannya adalah untuk menulis sebuah program yang menemukan angka licik tertinggi yang juga prima.
7 prima licik pertama (dan semua yang saya temukan sejauh ini) adalah:
2
5
3449
6287
7589
9397
93557 <-- highest so far (I've searched to 100,000,000+)
Saya tidak yakin secara resmi apakah lebih ada, tetapi saya berharap mereka ada. Jika Anda dapat membuktikan bahwa ada (atau tidak) yang banyak, saya akan memberi Anda +200 rep bounty.
Pemenangnya adalah orang yang dapat memberikan prime licik tertinggi, asalkan jelas bahwa mereka telah aktif dalam pencarian dan tidak sengaja mengambil kemuliaan dari orang lain.
Aturan
- Anda dapat menggunakan alat temuan utama apa pun yang Anda inginkan.
- Anda dapat menggunakan penguji utama probabilistik.
- Anda dapat menggunakan kembali kode orang lain dengan atribusi . Ini adalah upaya bersama. Taktik kejam tidak akan ditoleransi.
- Program Anda harus secara aktif mencari yang utama. Anda dapat memulai pencarian di prime licik yang paling dikenal.
- Program Anda harus dapat menghitung semua prima licik yang dikenal dalam waktu 4 jam dari Amazon EC2 t2.medium instance (baik empat sekaligus atau satu selama empat jam atau sesuatu di antaranya). Saya sebenarnya tidak akan mengujinya pada Anda dan Anda tentu tidak perlu. Ini hanya tolok ukur.
Berikut ini adalah kode Python 3 yang saya gunakan untuk membuat tabel di atas: (berjalan dalam satu atau dua detik)
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()