示例#1
0
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))
示例#2
0
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)
示例#3
0
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)))
示例#4
0
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())))
示例#6
0
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()
示例#7
0
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()