仙台の山奥で自転車に乗ったり転んだり

愛車の GIOS でサイクリングしたりポタリングしたり、それをブログに記録してみたり。ロードバイクや自転車や坂のことを書いてみたり。ときたまプログラムのことを忘れないようにメモってみたり。

簡易な誤り訂正符号

キャンペーンコードのようなもののために簡単なチェックの仕組みが作りたくて、思いつきで簡単な誤り訂正符号もどきを作ってみた。
で、あんまり考えてないけど、これって成り立っているのかすごく気になる。

<?php
define('MIN_N', 1);
define('MAX_N', 9999);

function multiple($n) {
    $i = rand(MIN_N, (int)(MAX_N / $n));

    return $i * $n;
}
function division($n) {
    $i = rand((MIN_N / 2), $n);

    return array(($n - $i), $i);
}

$numbers = array(3, 5, 7);
for ($i = 0; $i < 100; ++$i) {
    shuffle($numbers);
    $p = $numbers[0];
    $m = multiple($p);
    list($a, $b) = division($m);
    printf("%03d"
             . "\t"
             . "%04d-%04d-%d"
             . "\t"
             . "%4d  + %4d = %4d %% %d = %d"
             . PHP_EOL, 
          ($i + 1), 
          $a, $b, $p, 
          $a, $b, $m, $p, (($a + $b) % $p));
}