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
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
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
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
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
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