プロセッサによっては、64 ビット マシンを使用している場合は 2^63-1、32 ビット マシンを使用している場合は 2^31-1 で、マシンが計算できる 10 進数の長さが得られます。それを超えると、間違った値が得られます。番号をチャンクに分割することで、同じことができます。例: 私の番号は 10 進法で 18 であるため、9/7/2 = 18 のチャンクに分割されます。最初のチャンクの mod を計算します。最初の mod を 2 番目のチャンクの前に追加します。例: 最初の mod = 23 の結果、したがって 23XXXXXXX。結果の 23XXXXXXX の mod を見つけます。mod を最後のチャンクに追加します。例: mod = 15 の場合は 15XX。
$string = '123456789123456789'; // 18 decimal long
$chunk[0] = '123456789'; // 9 decimal long
$chunk[1] = '1234567'; // 7 decimal long
$chunk[2] = '89'; // 2 decimal long
$modulus = null;
foreach($chunk as $value){
$modulus = (int)($modulus.$value) % 45;
}
上記の $modulus の結果は、
$modulus = $string % 45 偶数より遅い方が良い。これが役立つことを願っています。同様のアプローチを持つ人はいますか?