login
Prefix (or Levenshtein) codes for natural numbers.
2

%I #32 Oct 25 2024 09:31:34

%S 0,2,12,13,112,113,114,115,232,233,234,235,236,237,238,239,3840,3841,

%T 3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,

%U 3855,7712,7713,7714,7715

%N Prefix (or Levenshtein) codes for natural numbers.

%D D. E. Knuth, "Supernatural Numbers", in D. A. Klarner, editor, The Mathematical Gardner. Prindle, Weber and Schmidt, Boston, 1981, pp. 310-325.

%D D. E. Knuth, Selected Papers on Fun and Games, CSLI, 2011.

%D R. E. Krichevsky, Szhatie i poisk informatsii (Compressing and searching for information), Moscow, 1988, ISBN 5-256-00325-9.

%H Matthew House, <a href="/A010097/b010097.txt">Table of n, a(n) for n = 0..10000</a>

%H Robert Munafo, <a href="http://mrob.com/pub/math/altnum.html#lexi">Alternative Number Formats</a>, section on "Lexicographic Strings".

%H Wikipedia, <a href="https://en.wikipedia.org/wiki/Levenshtein_coding">Levenshtein coding</a>

%F The code for n is found as follows: from right to left, the truncated (without the leading 1) binary representations of n, floor(log_2(n)), floor(log_2(floor(log_2(n)))), etc., are written as long as they consist of at least one bit; then we write a 0 followed by log*(n) 1's.

%o (Python)

%o def encode(n):

%o if n == 0: return "0"

%o c, C = "", 1

%o while n > 0:

%o b = bin(n)[3:]

%o c = b + c

%o if (m := len(b)) > 0: C += 1

%o n = m

%o c = "1" * C + "0" + c

%o return c

%o a = lambda n: int(encode(n),2) # _DarĂ­o Clavijo_, Aug 23 2024

%o (PARI) apply( {A010097(n)=if(n, n+2^(n=exponent(n))*((n=A010097(n))+2<<exponent(n+!n)-1))}, [0..44]) \\ _M. F. Hasler_, Oct 24 2024

%Y Knuth articles also give A000918 and A171885.

%K nonn,changed

%O 0,2

%A _Leonid Broukhis_

%E Offset corrected by _Matthew House_, Aug 15 2016