%I #19 Jun 24 2022 14:06:44
%S 0,1,2,4,3,8,5,16,6,24,7,32,9,20,10,36,11,48,12,18,13,64,14,80,15,96,
%T 17,40,19,72,21,104,22,128,23,160,25,68,26,100,27,192,28,34,29,224,30,
%U 256,31,320,33,76,35,88,37,136,38,144,39,208,41,84,42,132,43
%N Lexicographically earliest sequence of distinct nonnegative integers such that the binary expansions of two consecutive terms have no common 1, and the least value not yet in the sequence appears as soon as possible.
%C To build the sequence:
%C - we start with a(0) = 0, and then iteratively:
%C - let v be the last value, and u be the least value not yet in the sequence,
%C - if v AND u = 0, then the next value is u (AND denotes the bitwise AND operator),
%C - otherwise the next values are w and then u where w is chosen as small as possible.
%C This sequence is a variant of A109812 where we repeatedly force the least unseen value to appear as soon as possible.
%C By design, this is a permutation of the nonnegative integers (with inverse A352714).
%H Rémy Sigrist, <a href="/A352713/b352713.txt">Table of n, a(n) for n = 0..10000</a>
%H Rémy Sigrist, <a href="/A352713/a352713.png">Colored logarithmic scatterplot of the first 2^16 terms</a> (the color denotes the parity of n: blue for even, red for odd)
%H Rémy Sigrist, <a href="/A352713/a352713.gp.txt">PARI program</a>
%H <a href="/index/Bi#binary">Index entries for sequences related to binary expansion of n</a>
%H <a href="/index/Per#IntegerPermutation">Index entries for sequences that are permutations of the natural numbers</a>
%e The first terms are (stars correspond to "w" terms):
%e n a(n) bin(a(n)) w
%e -- ---- --------- -
%e 0 0 0
%e 1 1 1
%e 2 2 10
%e 3 4 100 *
%e 4 3 11
%e 5 8 1000 *
%e 6 5 101
%e 7 16 10000 *
%e 8 6 110
%e 9 24 11000 *
%e 10 7 111
%e 11 32 100000 *
%e 12 9 1001
%e 13 20 10100 *
%e 14 10 1010
%e 15 36 100100 *
%o (PARI) See Links section.
%o (Python)
%o from math import gcd
%o from itertools import count, islice
%o def agen(): # generator of terms
%o aset, v, u = {0}, 0, 1; yield 0
%o for n in count(1):
%o if v&u != 0:
%o w = u + 1
%o while w in aset or v&w != 0 or w&u != 0: w += 1
%o aset.add(w); yield w
%o v = u; aset.add(v); yield v
%o while u in aset: u += 1
%o print(list(islice(agen(), 65))) # _Michael S. Branicky_, Jun 24 2022
%Y Cf. A109812, A352714 (inverse).
%K nonn,base
%O 0,3
%A _Rémy Sigrist_, Mar 30 2022