Symmetristen binäärien lukujono

Yhtenä päivänä tuli mieleen tutkia millainen lukujono syntyy symmetrisistä binääreistä. Ideana oli juoksuttaa kokonaislukuja väliltä {1...n} ja testata jokaisen luvun kohdalla onko siitä muodostuva binääriluku palindromi, eli symmetrinen. Lähestyin ongelmaa koodaamalla lyhyen c/c++ koodin (testpali.cpp), jonka tehtävä oli tarkistaa symmetria ja antaa paluuarvo sen perusteella. Lukujen syöttämisen päätin jättää yksinkertaiselle bash-skriptille (pali.sh). Skriptiä askarrellessa huomasin heti, että sitä voi nopeuttaa 50% syöttämällä tarkistimelle vain parittomia lukuja.

Tuloksena syntyi seuraavanlainen lukujono. Esittämällä listan Ilman oikean puoleista selventävää binäärilukua (ts. esittämällä pelkät 10-kantaiset kokonaisluvut) sain muutamat ystäväni ihmettelemään lukujonon muodostumislogiikkaa. Kiintoisa sivuhuomio on, että lukusarjan binääriluvut ovat pituuksittain systemaattisissa nipuissa: 1-1-2-2-4-4-8-8-16-16-32-32-n-n. Kahteen saman mittaiseen symmetriseen binäärilukuun voi myös kohdistaa minkä tahansa Boolen algebran operaation, ja lopputulos on yhä symmetrinen (tosin sillä edellytyksellä, että operaatiossa mahdollisesti syntyviä etunollia ei saa pudottaa pois, eli saman mittaisuuden ehto kohdistuu myös lopputulokseen).

testpali.cpp

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    if(argc!=2)
    {
        //Invalid params -> exit
        return -1;
    }

    int len,i,j,flag=1;

    //Calculate length
    for(len=0;argv[1][len]!='\0';++len);

    //Test if binary palindrome
    for(i=0,j=len-1;i<len/2;++i,--j)
    {
        if(argv[1][j]!=argv[1][i])
        flag=0;
    }

    /* return 0; if is palindrome, or 1; if not */
    return flag;
}

pali.sh

#!/bin/sh

x=-1

while [ $x -le 999999 ]
do
  x=$(( $x + 2 ))
  #echo -n "$x "
  echo "obase=2; $x" | bc | xargs ./testpali
  retVal=$?
  if [ $retVal -ne 0 ]; then
    echo -n "$x\t"
    echo "obase=2; $x" | bc
  fi
done

Lisää uusi kommentti

Rajattu HTML

  • Sallitut HTML-tagit: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Rivit ja kappaleet päätetään automaattisesti.
  • Verkko- ja sähköpostiosoitteet muutetaan automaattisesti linkeiksi.