giriş
Bazı baz b'de pozitif bir tamsayı n alma ve her basamağı, sağ taraftaki basamağın temsili ile değiştirme işlemini düşünün .
- Sağdaki rakam 0 ise, b tabanını kullanın .
- Sağdaki rakam 1 ise, taksitli işaret olarak 0'lı tekli kullanın .
- Sağda bir rakam yoksa (yani, bir yerdesiniz), en önemli rakama dönün.
Örnek olarak n = 160 ve b = 10 olsun. Süreci çalıştırmak şöyle görünür:
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.
Aynı prosedür ancak sağ yerine sola hareket etmek de yapılabilir:
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.
Böylece, 160 ile ilgili iki sayı yaptık ( b = 10 için): 16 ve 10000000.
Bu süreçte üretilen iki sayıdan en az birini 2 veya daha fazla parçaya eşit olarak bölerse, n'yi kurnaz bir sayı olarak tanımlayacağız.
Örnekte n kurnaz çünkü 160 10000000'i tam olarak 62500 kez bölüyor.
203 kurnaz DEĞİLDİR, çünkü elde edilen rakamlar 2011 ve 203'tür, ki bu 203 2 veya daha fazla kez eşit olarak sığamaz.
Meydan okuma
(Sorunun geri kalanı için sadece b = 10'u ele alacağız .)
Zor olan, aynı zamanda en yüksek kurnazlık numarasını bulan bir program yazmaktır.
İlk 7 kurnaz ilkesi (ve şimdiye kadar bulduğum her şey):
2
5
3449
6287
7589
9397
93557 <-- highest so far (I've searched to 100,000,000+)
Daha fazlası olup olmadığından resmi olarak emin değilim, ama olmasını bekliyorum. Eğer son derece çok sayıda olduğunu (ya da olmadığını) kanıtlayabilirsen sana +200 lütuf temsilcisi vereceğim.
Kazanan, aramada aktif olmaları ve kasıtlı olarak başkalarından şan almadılarsa, en yüksek kurnazlık başbakanını sağlayabilecek kişi olacaktır.
kurallar
- İstediğiniz herhangi bir asal bulma aracını kullanabilirsiniz.
- Olasılıksal ana test cihazları kullanabilirsiniz.
- Diğer insanların kodlarını ilişkilendirmeyle yeniden kullanabilirsiniz . Bu toplumsal bir çabadır. Kıyasıya taktikler hoş görülmeyecek.
- Programınız asal olarak etkin bir şekilde arama yapmalıdır. Aramanıza bilinen en yüksek kurnazca başlayabilirsiniz.
- Programınız , Amazon EC2 t2.medium örneklerinden 4 saat içinde bilinen kurnaz primellerin tümünü hesaplayabilmelidir (ya bir seferde dört ya da dört saat boyunca bir ya da aradaki bir şey). Aslında onları test etmeyeceğim ve kesinlikle buna gerek yok. Bu sadece bir kriter.
Yukarıdaki tabloyu oluşturmak için kullandığım Python 3 kodum: (bir veya iki saniye içinde çalışır)
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()