Ejemplo n.º 1
0
def power_partitions(n,k):
    """
    Partitions of n into powers of k in reverse lexicographic order\n
    Finite generator
    """
    
    if n < 0:
        raise ValueError("n must be non-negative")
    if k < 1:
        raise ValueError("k must be positive")
    
    if n == k:
        yield (n,)
    
    if n == 0:
        yield ()
    
    if n == 1:
        yield (1,)
    
    else:
        for p in powers(k):
            if p >= n:
                break
        
        while p >= k:
            p = p//k
            for S in power_partitions(n-p,k):
                if S[0] <= p:
                    yield (p,) + S
Ejemplo n.º 2
0
def composition_count():
    """
    Number of compositions (ordered partition) for each natural (2**(n-1) for n > 0)\n
    OEIS A011782
    """
    
    yield 1
    
    for p in powers(2):
        yield p
Ejemplo n.º 3
0
def binary_length():
    """
    Binary Length: Bits in the binary representation of each non-negative integer\n
    OEIS A070939
    """

    yield 1
    yield 1

    for n, p in enumerate(offset(powers(2), 1), 2):
        for i in range(p):
            yield n
Ejemplo n.º 4
0
def ruler():
    """
    Ruler Sequence: Largest power of 2 dividing each positive integer, also height of gradation at each position of an infinite ruler\n
    OEIS A000120
    """

    for e in offset(evens(), 1):
        yield 0

        for n, p in enumerate(powers(2)):
            if e % p != 0:
                yield n - 1
                break
Ejemplo n.º 5
0
def base_length(B=10):
    """
    Binary Length: Symbols in the representation of each non-negative integer in base B\n
    OEIS A070939
    """

    require_integers(["B"], [B])
    require_geq(["B"], [B], 2)

    for i in range(B):
        yield 1

    for n, p in enumerate(offset(powers(B), 1), 2):
        for i in range(p):
            yield n
Ejemplo n.º 6
0
def bin_log_digits(n):
    """
    Decimal digits of the base 2 logarithm of n
    """

    num = n
    den = 1

    while True:
        int_part = num // den

        for e, p in enumerate(powers(2), -1):
            if p > int_part:
                break

        yield e

        den = den * 2**e

        num = num**10
        den = den**10
        g = gcd(num, den)

        num, den = num // g, den // g