def _show_NT_np_p2(max_p): '''[n>=p**2]: NT(n,p**2) = C(n,p**2) - [p\n]C(n/p,p) [n>=p]: NT(n*p,p**2) = C(n*p,p**2) - C(n,p) ''' for p in primes(max_p): f = C(n * p, p**2) - C(n, p) g = f.factor() print('NT(n*p, {p}**2) = {f}'.format(p=p, f=g))
def calc_B(m, base): assert m >= 0 L = m + 1 Cs = [C(m, j) for j in range(L)] B = [[c * (i + base)**(m - j) for j, c in zip(range(L), Cs)] for i in range(L)] return Matrix(B)
def choose_without_period(n, k): r'''NT n k = sum Mu d * C(n/d, k/d) {d\gcd(n,k)} for [(n,k)!=(0,0)] NT 0 0 = 1 ''' if (n, k) == (0, 0): return 1 return sum(Mu_d * C(n // d, k // d) for Mu_d, d in iter_Mu(gcd(n, k)))
def show_nth_row(As, r): Ds = [] for m, A in enumerate(As): if m < r: continue print('\n m =', m) row = A[r, :] ls = list(row) g = gcd(ls) #print(1/g, factorial(m)) #error: assert 1/g % factorial(m) == 0 #print(1/g) #print('{}/{}'.format(row/g, 1/g)) D_g = 1 / g Ds.append(D_g / factorial(m)) common_D = factorial(m) * lcm([2**m, m + 1]) common2_D = factorial(m + 1) * 2**m k = D_g / common_D r2k = [1, 1, 3, 1, 15, 3, 21, 3, 45, 5] if r < len(r2k): D_g = r2k[r] * common_D if r == 2: b = D_g == 12 * factorial(m) assert row[0] == (-1)**(m + 1) * (m - 2) / D_g elif r == 3: b = D_g == 8 * factorial(m) elif r == 4: b = D_g == 240 * factorial(m) elif r == 5: b = D_g == 96 * factorial(m) elif r == 6: b = D_g == 1344 * factorial(m) #{2: 6, 3: 1, 7: 1} elif r == 7: b = D_g == 384 * factorial(m) # {2: 7, 3: 1} if 2 <= r <= 7: assert b is True #assert D_g % common_D == 0 assert D_g * g % 1 == 0 Ns = row * D_g print('{Ns}/{D}, {D}/{m}!/2**m = {q}'.format(Ns=Ns, D=D_g, m=m, q=D_g / common_D)) if m > r: print('ts = [0]preNs - preNs[0] = {}'.format(sub_0Ns_Ns0)) print('Ns - ts = {}'.format(Ns - sub_0Ns_Ns0)) _Ns = list(Ns) _0Ns = [0] + _Ns _Ns0 = _Ns + [0] _0Ns, _Ns0 = map(Matrix, (_0Ns, _Ns0)) sub_0Ns_Ns0 = (_0Ns - _Ns0).H #print('[0]row - row[0] = {}'.format(sub_0Ns_Ns0)) if r == 2: if m > r: assert next_Ns == Ns neg_dNs = [(-1)**(m + 1 - i) * C(m + 1, i) for i in range(m + 2)] print('(-1)**(m+1-i)C(m+1, \\i) = {}'.format(neg_dNs)) next_Ns = sub_0Ns_Ns0 - Matrix([neg_dNs]) #print('next Ns = {}'.format(next_Ns)) #print(row/factorial(m)) D = lcm(Ds) print('lcm(D/m!) =', D, fi(D)) return r, D, fi(D) '''
print('S(k={k}, 1-z, n) = {s}'.format(k=i, s=t(i))) elif 0: #T d z = sum z**i C(i,d) {~i} ## test = k ## ans = test.subs(k,k-1) ## print(ans) ## assert ans == k-1 T = Sum(ff(i,k) * z**i, (i,0,n)) K = T - ff(n,k)*z**n + k*z* T.subs(k,k-1) #ans = K.doit() fail for i in range(1,5): a = K.subs(n,i).doit().expand(force=True) print(a) elif 0: print(Sum(1,(i,0,n-1)).doit()) T = Sum((-1)**(n-j) * C(j,k), (j,0,n-1)) T2 = T.subs(n, 2*n) T3 = T.subs(n,2*n+1) print(T2) print(T3) for i in range(0,5): D = -2*factorial(i) a2 = T2.subs(k,i).doit().simplify() #.expand(force=True) #print(factor(a)) b2 = a2.subs(n, n/2) print('[even n]: {} = ({})/{}'.format(factor(b2), (b2*D).expand(), D)) a3 = T3.subs(k,i).doit().simplify() b3 = a3.subs(n, (n-1)/2) print('[odd n]: {} = {}'.format(factor(b3), gcd_terms(b3.expand())))
def Stirling_subset_tail(n, x): '''Stirling{x, x-n} = sum Eulerian<<n,k>> C(x+n-1-k, 2n) {k}, for [NN n]''' return sum(Eulerian2nd(n, k) * C(x + n - 1 - k, 2 * n) for k in range(n)).simplify()
def Stirling_circle_tail(n, x): '''Stirling[x, x-n] = sum Eulerian<<n,k>> C(x+k, 2n) {k}, for [NN n]''' #return summation(Eulerian2nd(n, k)*C(x+k, 2*n), (k, 0, n)).doit() return sum(Eulerian2nd(n, k) * C(x + k, 2 * n) for k in range(n)).simplify()