Наивный ЛФСР, перевод языка программирования на математику - PullRequest
3 голосов
/ 20 марта 2011

Существует математическая проблема, это проблема генерации последовательности из n уникальных случайных чисел (случайное число является элементом N {0, ..., n}, (как перестановка, но без использования памяти)

Недавно я решил эту проблему, и я получил некоторый результат (читай ниже, без использования формальной математики, просто путем программирования).

и кажется, что эта проблема уже была решена в прошлом путем построения LFSR (Линейный регистр сдвига с обратной связью) Галуа или какого-то другого математика. (Я действительно впервые узнал о LFSR, а затем создал свой «вид» решения, потому что я не мог понять статью LFSR на вики и не хотел просто скопировать и вставить исходный код)

Дело в том, что я не понимаю слова формальной математики и хотел бы выучить его и сравнить мое решение с решением LFSR, поэтому вопрос:

Можете ли вы сравнить то, что я сделал с этой вещью, и каким-то образом перевести это на формальную математику и наоборот. чтобы я мог понять, что я делал и что делали формальные математики (и зачем им это было нужно)?

помните, что мой язык программирования - я понимаю только память и ее адресацию, состояния памяти, строки нулей и единиц и т. Д., И я не понимаю примитивных полиномов, теории поля и других математических слов.

Большое спасибо заранее, если ты мне поможешь, я куплю тебе пива, когда увижу тебя.

Вот мой код ниже (вы можете запустить его в браузере, я не говорю, что это правильно, но я верю, что идея должна быть близка, у меня нет других идей, как ее решить.):

<html>
<head>
<script>

//-------------------------------------------------

function getPlacement( num ){ //; knuth permutations
  var places = [];

  for( var i = 0; i < num; ++i )
     places.push( i );

  var last_index = num-1;
  for( var i = num; i > 0; --i ){
    var rnd_index = Random( i );
    places = swap( places, rnd_index, last_index );
    last_index--;
  }

  return places;
}

function readNum( num, placement ){
   var numstr = num.toString(2);            
   numstr = zeroextend( numstr, placement.length ); 
   var numarr = numstr.split('');           

   var ret = [];
   for( var i = 0; i < placement.length; ++i ){
      ret.push( numarr[ placement[i] ] );      
   }
   return ret.join('');
}

function UniqRndSeq( maxLength, output ){

   var placesNeeded = maxLength.toString(2).length;
   var randomPlacement = getPlacement( placesNeeded );

   var initPosition = Random( maxLength );
   var cnt = initPosition;

   var rndn;
   var numret = [];

   do{
     rndn = parseInt( readNum( cnt, randomPlacement ), 2);
     output( rndn );

     if( Containz( numret, rndn ) ) alert(rndn); 
     numret.push(rndn);     

     ++cnt;
     cnt = cnt % maxLength;

   } while( cnt != initPosition );  

}

//-------------------------------------------------
//; helper funs
var outp = [];

function display( num ){
   outp.push( num + "<br>" );
}

function Random( x ){
   return Math.floor(Math.random()*x);
}

function Containz( arr, num ){
   for( var i = 0; i < arr.length; ++i ){
      if( arr[i] == num ) return true;
   }
   return false;
}

function swap( list, a, b ){
   var tmp = list[a];
   list[a] = list[b];
   list[b] = tmp;
   return list;
}

function zeroextend( num_bin_str, length ){
   while( num_bin_str.length != length ){
      num_bin_str = "0" + num_bin_str;
   } 
   return num_bin_str;
}

//-------------------------------------------------

function init(){
   UniqRndSeq( 256, display);
   document.body.innerHTML = outp.join('');
}


</script>
</head>
<body onload="init();">

</body>
</html>

1 Ответ

2 голосов
/ 20 марта 2011

Регистр сдвига с линейной обратной связью (LFSR) является детерминированным, то есть он не использует какую-либо функцию случайного числа.Поэтому маловероятно, что ваш код моделирует LFSR.Если вы ничего не знаете о полиномиальных кольцах или теории конечного поля, было бы трудно объяснить математику, стоящую за LFSR.Однако надлежащий LFSR генерирует так называемую m-последовательность из n-битных цифровых слов, где n - количество этапов в LFSR.Длина последовательности составляет 2 ^ n - 1 слов (нулевое слово отсутствует в последовательности).В общем, нас интересует только одна битовая позиция в словах в последовательности.(В Galois LFSR это обычно 0-битный по соглашению, но все биты на самом деле имеют одинаковые свойства).Этот единственный бит, извлеченный из каждого слова, образует битовую последовательность длиной 2 ^ n - 1, которая имеет следующие хорошо известные математические свойства, связанные со случайностью:

Свойство баланса: Число1 в последовательности приближается к числу 0, поскольку длина последовательности приближается к бесконечности.Число 1 в последовательности на самом деле всегда на единицу больше, чем число 0.Обратите внимание, что длина последовательности нечетна, поэтому числа 1 и 0 не могут быть равны.

Свойство прогонов: Количество прогонов длины m + 1 равно половине числа длины mпробеги.Прогон длины m - это битовая последовательность длины m всех 1 или всех 0.

Свойство корреляции: Автокорреляция последовательности приближается к нулю *, когда длина последовательности приближается к бесконечности[* точнее, дельта-функция Кронекера].То есть, если взять последовательность и сравнить ее с самой собой, сдвинутой во времени на t количество бит, где t не равно длине последовательности, количество позиций битов гдесравнение равно примерно равно количеству позиций, где сравнение неравно.По сути, это означает, что последовательность лишена периодических подпоследовательностей.

Вы можете сравнить результаты вашего кода с этими свойствами и сделать свои собственные выводы относительно того, насколько близко результаты приближаются к LFSR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...