Created
September 27, 2021 15:43
-
-
Save Parcly-Taxel/d84d42135507bdc463f7c06429b2d769 to your computer and use it in GitHub Desktop.
Pandigital supremacy (PSE #111850)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
from math import comb, factorial as fac | |
def oS(n, k): # "ordered Stirling numbers" S(n,k) * k! | |
return sum((-1)**i * comb(k,i) * (k-i)**n for i in range(k+1)) | |
def num_pandig(n): | |
return 9*oS(n,10)//10 | |
def num_pandig_with_prefix(prefix, f): | |
r = 10 - len(set(str(prefix))) | |
return sum(comb(f,k) * oS(k,r) * (10-r)**(f-k) for k in range(r, f+1)) | |
def num_pandig_atmost(n): | |
sn = str(n) | |
ndigits = len(sn) | |
count = sum(num_pandig(k) for k in range(1, ndigits)) | |
for pl in range(1, ndigits+1): | |
prefix = int(sn[:pl]) | |
for d in range(1, prefix%10 + (pl>1)): | |
count += num_pandig_with_prefix(prefix-d, ndigits-pl) | |
return count + (len(set(sn)) == 10) | |
def non_pandig_abundance(n): | |
return n - 2*num_pandig_atmost(n) | |
for d in range(1, 11): | |
print(f"{d}*10^26", non_pandig_abundance(d*10**26)) # 2 | |
for d in range(21, 31): | |
print(f"{d}*10^25", non_pandig_abundance(d*10**25)) # 4 | |
for d in range(241, 251): | |
print(f"{d}*10^24", non_pandig_abundance(d*10**24)) # 5 | |
for d in range(2451, 2461): | |
print(f"{d}*10^23", non_pandig_abundance(d*10**23)) # 8 | |
for d in range(24581, 24591): | |
print(f"{d}*10^22", non_pandig_abundance(d*10**22)) # 3 | |
for d in range(245831, 245841): | |
print(f"{d}*10^21", non_pandig_abundance(d*10**21)) # 6 | |
for d in range(2458361, 2458371): | |
print(f"{d}*10^20", non_pandig_abundance(d*10**20)) # 7 | |
for d in range(24583671, 24583681): | |
print(f"{d}*10^19", non_pandig_abundance(d*10**19)) # 2 | |
for d in range(245836721, 245836731): | |
print(f"{d}*10^18", non_pandig_abundance(d*10**18)) # 7 | |
for d in range(2458367271, 2458367281): | |
print(f"{d}*10^17", non_pandig_abundance(d*10**17)) # 7 | |
for d in range(24583672771, 24583672781): | |
print(f"{d}*10^16", non_pandig_abundance(d*10**16)) # 0 | |
for d in range(245836727701, 245836727711): | |
print(f"{d}*10^15", non_pandig_abundance(d*10**15)) # 7 | |
for d in range(2458367277071, 2458367277081): | |
print(f"{d}*10^14", non_pandig_abundance(d*10**14)) # 1 | |
for d in range(24583672770711, 24583672770721): | |
print(f"{d}*10^13", non_pandig_abundance(d*10**13)) # 6 | |
for d in range(245836727707161, 245836727707171): | |
print(f"{d}*10^12", non_pandig_abundance(d*10**12)) # 4 | |
for d in range(2458367277071641, 2458367277071651): | |
print(f"{d}*10^11", non_pandig_abundance(d*10**11)) # 1 | |
for d in range(24583672770716411, 24583672770716421): | |
print(f"{d}*10^10", non_pandig_abundance(d*10**10)) # 3 | |
for d in range(245836727707164131, 245836727707164141): | |
print(f"{d}*10^9", non_pandig_abundance(d*10**9)) # 9 | |
print() | |
N = 245836727707164139860503406 | |
for k in range(N-5, N+6): | |
print(k, non_pandig_abundance(k)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment