35 lines
1.0 KiB
Python
35 lines
1.0 KiB
Python
''' python example for task rosettacode.org/wiki/Blum_integer '''
|
|
|
|
from sympy import factorint
|
|
|
|
|
|
def generate_blum():
|
|
''' Generate the Blum integers in series '''
|
|
for candidate in range(1, 10_000_000_000):
|
|
fexp = factorint(candidate).items()
|
|
if len(fexp) == 2 and sum(p[1] == 1 and p[0] % 4 == 3 for p in fexp) == 2:
|
|
yield candidate
|
|
|
|
|
|
print('First 50 Blum integers:')
|
|
lastdigitsums = [0, 0, 0, 0]
|
|
|
|
for idx, blum in enumerate(generate_blum()):
|
|
if idx < 50:
|
|
print(f'{blum: 4}', end='\n' if (idx + 1) % 10 == 0 else '')
|
|
elif idx + 1 in [26_828, 100_000, 200_000, 300_000, 400_000]:
|
|
print(f'\nThe {idx+1:,}th Blum number is {blum:,}.')
|
|
|
|
j = blum % 10
|
|
lastdigitsums[0] += j == 1
|
|
lastdigitsums[1] += j == 3
|
|
lastdigitsums[2] += j == 7
|
|
lastdigitsums[3] += j == 9
|
|
|
|
if idx + 1 == 400_000:
|
|
print('\n% distribution of the first 400,000 Blum integers is:')
|
|
for k, dig in enumerate([1, 3, 7, 9]):
|
|
print(f'{lastdigitsums[k]/4000:>8.5}% end in {dig}')
|
|
|
|
break
|