from collections import defaultdict
import primesieve
def count_last_digs():
counts = defaultdict(int)
primes = primesieve.Iterator()
primes.next_prime()
primes.next_prime()
primes.next_prime()
p1 = primes.next_prime()
p1d = p1 % 10
limit = 10**6
while True:
p2 = primes.next_prime()
p2d = p2 % 10
counts[p1d, p2d] += 1
if p2 > limit:
print
("{:_}".
format(limit
), clock() - t0
) print_counts(counts)
limit = 10*limit if limit <= 1000_000_000 else limit + 10_000_000_000
p1d = p2d
return counts
def print_counts(counts):
S = sum(counts.values())
C = {k: v / S for k, v in counts.items()}
V = [1, 3, 7, 9]
for v1 in V:
for v2 in V:
print("{:6.3f}".format(C[v1, v2]), end=" ")
print()
print()
count_last_digs()
"""
1_000_000
0.041 0.080 0.083 0.045
0.056 0.036 0.074 0.085
0.065 0.069 0.037 0.079
0.089 0.065 0.056 0.040
10_000_000
0.043 0.078 0.080 0.049
0.058 0.039 0.073 0.080
0.064 0.069 0.039 0.078
0.085 0.065 0.058 0.042
100_000_000
0.044 0.076 0.078 0.052
0.059 0.042 0.072 0.078
0.064 0.068 0.042 0.076
0.083 0.064 0.059 0.044
1_000_000_000
0.046 0.075 0.076 0.054
0.060 0.044 0.071 0.076
0.064 0.068 0.044 0.075
0.080 0.064 0.060 0.046
10_000_000_000
0.047 0.074 0.074 0.055
0.060 0.046 0.070 0.074
0.064 0.067 0.046 0.074
0.079 0.064 0.060 0.047
340_000_000_000 14630.772475548303
0.049 0.072 0.072 0.057
0.061 0.048 0.069 0.072
0.063 0.067 0.048 0.072
0.077 0.063 0.061 0.049
350_000_000_000 15045.708864189168
0.049 0.072 0.072 0.057
0.061 0.048 0.069 0.072
0.063 0.067 0.048 0.072
0.077 0.063 0.061 0.049
1_140_000_000_000 32903.831111384796
0.049 0.072 0.072 0.057
0.061 0.048 0.069 0.072
0.063 0.066 0.048 0.072
0.076 0.063 0.061 0.049
2_610_000_000_000 73682.21293810359
0.049 0.072 0.072 0.057
0.061 0.049 0.069 0.072
0.063 0.066 0.049 0.072
0.076 0.063 0.061 0.049
3_130_000_000_000 88038.33787216355
0.050 0.072 0.071 0.057
0.061 0.049 0.069 0.071
0.063 0.066 0.049 0.072
0.076 0.063 0.061 0.050
4_240_000_000_000 118131.35975553434
0.050 0.072 0.071 0.057
0.061 0.049 0.068 0.071
0.063 0.066 0.049 0.072
0.076 0.063 0.061 0.050
"""
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSB0aW1lIGltcG9ydCBjbG9jawoKaW1wb3J0IHByaW1lc2lldmUKCmRlZiBjb3VudF9sYXN0X2RpZ3MoKToKICAgIHQwID0gY2xvY2soKQogICAgY291bnRzID0gZGVmYXVsdGRpY3QoaW50KQogICAgcHJpbWVzID0gcHJpbWVzaWV2ZS5JdGVyYXRvcigpCiAgICBwcmltZXMubmV4dF9wcmltZSgpCiAgICBwcmltZXMubmV4dF9wcmltZSgpCiAgICBwcmltZXMubmV4dF9wcmltZSgpCiAgICBwMSA9IHByaW1lcy5uZXh0X3ByaW1lKCkKICAgIHAxZCA9IHAxICUgMTAKICAgIGxpbWl0ID0gMTAqKjYKICAgIHdoaWxlIFRydWU6CiAgICAgICAgcDIgPSBwcmltZXMubmV4dF9wcmltZSgpCiAgICAgICAgcDJkID0gcDIgJSAxMAogICAgICAgIGNvdW50c1twMWQsIHAyZF0gKz0gMQogICAgICAgIGlmIHAyID4gbGltaXQ6CiAgICAgICAgICAgIHByaW50KCJ7Ol99Ii5mb3JtYXQobGltaXQpLCBjbG9jaygpIC0gdDApCiAgICAgICAgICAgIHByaW50X2NvdW50cyhjb3VudHMpCiAgICAgICAgICAgIGxpbWl0ID0gMTAqbGltaXQgaWYgbGltaXQgPD0gMTAwMF8wMDBfMDAwIGVsc2UgbGltaXQgKyAxMF8wMDBfMDAwXzAwMAogICAgICAgIHAxZCA9IHAyZAogICAgcmV0dXJuIGNvdW50cwoKZGVmIHByaW50X2NvdW50cyhjb3VudHMpOgogICAgUyA9IHN1bShjb3VudHMudmFsdWVzKCkpCiAgICBDID0ge2s6IHYgLyBTIGZvciBrLCB2IGluIGNvdW50cy5pdGVtcygpfQogICAgViA9IFsxLCAzLCA3LCA5XQogICAgZm9yIHYxIGluIFY6CiAgICAgICAgZm9yIHYyIGluIFY6CiAgICAgICAgICAgIHByaW50KCJ7OjYuM2Z9Ii5mb3JtYXQoQ1t2MSwgdjJdKSwgZW5kPSIgICIpCiAgICAgICAgcHJpbnQoKQogICAgcHJpbnQoKQoKY291bnRfbGFzdF9kaWdzKCkKCgoiIiIKMV8wMDBfMDAwCiAwLjA0MSAgIDAuMDgwICAgMC4wODMgICAwLjA0NQogMC4wNTYgICAwLjAzNiAgIDAuMDc0ICAgMC4wODUKIDAuMDY1ICAgMC4wNjkgICAwLjAzNyAgIDAuMDc5CiAwLjA4OSAgIDAuMDY1ICAgMC4wNTYgICAwLjA0MAoKMTBfMDAwXzAwMAogMC4wNDMgICAwLjA3OCAgIDAuMDgwICAgMC4wNDkKIDAuMDU4ICAgMC4wMzkgICAwLjA3MyAgIDAuMDgwCiAwLjA2NCAgIDAuMDY5ICAgMC4wMzkgICAwLjA3OAogMC4wODUgICAwLjA2NSAgIDAuMDU4ICAgMC4wNDIKCjEwMF8wMDBfMDAwCiAwLjA0NCAgIDAuMDc2ICAgMC4wNzggICAwLjA1MgogMC4wNTkgICAwLjA0MiAgIDAuMDcyICAgMC4wNzgKIDAuMDY0ICAgMC4wNjggICAwLjA0MiAgIDAuMDc2CiAwLjA4MyAgIDAuMDY0ICAgMC4wNTkgICAwLjA0NAoKMV8wMDBfMDAwXzAwMAogMC4wNDYgICAwLjA3NSAgIDAuMDc2ICAgMC4wNTQKIDAuMDYwICAgMC4wNDQgICAwLjA3MSAgIDAuMDc2CiAwLjA2NCAgIDAuMDY4ICAgMC4wNDQgICAwLjA3NQogMC4wODAgICAwLjA2NCAgIDAuMDYwICAgMC4wNDYKCjEwXzAwMF8wMDBfMDAwCiAwLjA0NyAgIDAuMDc0ICAgMC4wNzQgICAwLjA1NQogMC4wNjAgICAwLjA0NiAgIDAuMDcwICAgMC4wNzQKIDAuMDY0ICAgMC4wNjcgICAwLjA0NiAgIDAuMDc0CiAwLjA3OSAgIDAuMDY0ICAgMC4wNjAgICAwLjA0NwoKIAozNDBfMDAwXzAwMF8wMDAgMTQ2MzAuNzcyNDc1NTQ4MzAzCiAwLjA0OSAgIDAuMDcyICAgMC4wNzIgICAwLjA1NwogMC4wNjEgICAwLjA0OCAgIDAuMDY5ICAgMC4wNzIKIDAuMDYzICAgMC4wNjcgICAwLjA0OCAgIDAuMDcyCiAwLjA3NyAgIDAuMDYzICAgMC4wNjEgICAwLjA0OQoKMzUwXzAwMF8wMDBfMDAwIDE1MDQ1LjcwODg2NDE4OTE2OAogMC4wNDkgICAwLjA3MiAgIDAuMDcyICAgMC4wNTcKIDAuMDYxICAgMC4wNDggICAwLjA2OSAgIDAuMDcyCiAwLjA2MyAgIDAuMDY3ICAgMC4wNDggICAwLjA3MgogMC4wNzcgICAwLjA2MyAgIDAuMDYxICAgMC4wNDkKCjFfMTQwXzAwMF8wMDBfMDAwIDMyOTAzLjgzMTExMTM4NDc5NgogMC4wNDkgICAwLjA3MiAgIDAuMDcyICAgMC4wNTcKIDAuMDYxICAgMC4wNDggICAwLjA2OSAgIDAuMDcyCiAwLjA2MyAgIDAuMDY2ICAgMC4wNDggICAwLjA3MgogMC4wNzYgICAwLjA2MyAgIDAuMDYxICAgMC4wNDkKCjJfNjEwXzAwMF8wMDBfMDAwIDczNjgyLjIxMjkzODEwMzU5CiAwLjA0OSAgIDAuMDcyICAgMC4wNzIgICAwLjA1NwogMC4wNjEgICAwLjA0OSAgIDAuMDY5ICAgMC4wNzIKIDAuMDYzICAgMC4wNjYgICAwLjA0OSAgIDAuMDcyCiAwLjA3NiAgIDAuMDYzICAgMC4wNjEgICAwLjA0OQoKIDNfMTMwXzAwMF8wMDBfMDAwIDg4MDM4LjMzNzg3MjE2MzU1CiAwLjA1MCAgIDAuMDcyICAgMC4wNzEgICAwLjA1NwogMC4wNjEgICAwLjA0OSAgIDAuMDY5ICAgMC4wNzEKIDAuMDYzICAgMC4wNjYgICAwLjA0OSAgIDAuMDcyCiAwLjA3NiAgIDAuMDYzICAgMC4wNjEgICAwLjA1MAoKIDRfMjQwXzAwMF8wMDBfMDAwIDExODEzMS4zNTk3NTU1MzQzNAogMC4wNTAgICAwLjA3MiAgIDAuMDcxICAgMC4wNTcKIDAuMDYxICAgMC4wNDkgICAwLjA2OCAgIDAuMDcxCiAwLjA2MyAgIDAuMDY2ICAgMC4wNDkgICAwLjA3MgogMC4wNzYgICAwLjA2MyAgIDAuMDYxICAgMC4wNTAKCiIiIg==