(MATLAB)
sequence(1) = 0; % value for null bits
for numberofBits = 1:2:maxNumberofBits
numbersPerWordlength = 2^numberofBits;
for n = 1:numbersPerWordlength
iterations = 0;
word = n-1;
while word > 0
word_reversed = 0;
% reverse bit order
for i = 1:numberofBits
word_reversed = bitset(word_reversed, numberofBits-i+1, bitget(word, i));
end
% binary subtraction with worlength of numbersPerWordlength
if word >= word_reversed
word = word-word_reversed;
else
word = numbersPerWordlength + word - word_reversed;
end
if word > 0 % if == 0 it was already a palindrome
iterations = iterations+1;
end
end
iterations_list(n) = iterations;
end
sequence(numberofBits+1) = max(iterations_list);
end
(PARI) \\ here T(n, k) gives A338203(n, k).
bitrev(w, b)={my(r=0); for(i=1, w, r=(r<<1) + bitand(b, 1); b>>=1); r}
T(n, b) = {my(t=0, r=bitrev(n, b)); while(r<>b, t++; b-=r; if(b<0, b+=2^n); r=bitrev(n, b)); t}
a(n) = {my(r=0); for(b=0, 4^n-1, r=max(r, T(2*n, b))); r} \\ Andrew Howroyd, Oct 16 2020
|