login
A327296
a(n) is the decimal value of the largest binary palindrome that can be obtained from the digits of the binary representation of n.
1
0, 1, 1, 3, 1, 5, 5, 7, 1, 9, 9, 7, 9, 7, 7, 15, 1, 17, 17, 21, 17, 21, 21, 27, 17, 21, 21, 27, 21, 27, 27, 31, 1, 33, 33, 21, 33, 21, 21, 51, 33, 21, 21, 51, 21, 51, 51, 31, 33, 21, 21, 51, 21, 51, 51, 31, 21, 51, 51, 31, 51, 31, 31, 63, 1, 65, 65, 73, 65, 73
OFFSET
0,4
COMMENTS
a(n) is the largest-valued binary palindrome that can be constructed from the binary representation of n. The palindrome may not have a leading 0.
When constructing a palindrome from a binary string, digits may only be permuted and deleted. I.e., the constructed palindrome will contain the same number or fewer 1's and 0's as the original binary string.
The algorithm is as follows:
If there is an odd number of 1's in the original binary string, start by placing a 1 in the middle of the output palindrome. Note that the remaining number of 1's is now even. If the remaining number of 1's is zero, then the constructed palindrome is simply "1" because the constructed palindrome cannot have leading zeros. If the remaining number of 1's is greater than zero, then place the remaining 0's evenly on either side of the previously placed "1". Because the output must be a palindrome, if the original string contains an odd number of 0's, then one of the 0's will be discarded. Lastly, place the remaining 1's on either end of the constructed palindrome.
If there is an even number of 1's in the original binary string, start by placing all of the 0's from the original string in the center of the palindrome, then place the 1's evenly on either side of the 0's.
EXAMPLE
The largest palindrome that can be constructed:
For 101 it is 101, thus a(5) = 5.
For 1000 it is 1, thus a(8) = 1.
For 1010 it is 1001, thus a(10) = 9.
For 1011 it is 111, thus a(11) = 7.
MATHEMATICA
a[n_] := Block[{o, z}, {o, z} = DigitCount[n, 2]; If[o==1, 1, If[OddQ@ o, {o, z} = Floor[{o, z} /2]; 2^(z + o) + (2^o - 1) (1 + 2^(o + 1 + 2 z)), o = o/2; (2^o - 1) (1 + 2^(o + z))]]]; a /@ Range[0, 70] (* Giovanni Resta, Sep 16 2019 *)
PROG
(Python)
def a(n):
#convert n to binary string
bin_str = str(bin(n))[2:]
#count 1's and 0's in the string
zeros = bin_str.count('0')
ones = len(bin_str) - zeros
if(ones == 1 or ones == 0):
return ones
pal = ""
if(ones % 2 == 1):
#start by placing a '1' in the middle of the string
pal = '1'
#place as many 0's around the central '1' as possible
for i in range(0, zeros >> 1):
pal = '0' + pal + '0'
else:
#place all 0's in the center
for i in range(0, zeros):
pal += '0'
#place the remaining 1's (guaranteed to be an even number, because one '1' was placed in the middle) on either side of the palindrome
for i in range(0, ones >> 1):
pal = '1' + pal + '1'
#return integer value of the constructed palindrome
return int(pal, 2)
CROSSREFS
Cf. A006995 (binary palindromes), A057148.
Sequence in context: A375061 A196361 A213613 * A213612 A186754 A124741
KEYWORD
base,nonn,easy
AUTHOR
Ian Band, Sep 16 2019
EXTENSIONS
More terms from Giovanni Resta, Sep 16 2019
STATUS
approved