2015/10/21(水)マイナンバー素数確認ツール 更新
不具合内容は
「Excel2007で使用した場合にある条件を満たした場合に素数判定が正常に行われない」
というもの。
修正版
mynumber_prime_chk_r2.zip
詳細内容
不具合の原因はExcel2007のMOD関数の仕様によるものです。
Excel2007のMod関数は以下のような仕様になっています。
MOD() 関数では、"除数" に 134,217,728 (2 の 27 乗) を掛けた値が、"数値" 以下となる場合、#NUM! エラー値が返されます。マクロ(ユーザー定義関数)なしで素数判定するために\sqrt{{10}^{12}}以下の全素数で割った余りをMOD関数で求めて
MOD() 関数で #NUM! エラー値が返される
余りが0になる個数をCOUNT関数で数えることで素数かをチェックするようになっているのですが
この仕様によりチェック対象が2^{27}×2=2^{28}以上で
その値の素因数に\frac{10^{12}}{2^{27}}以下があり
それ以上で\sqrt{10^{12}}以下の素因数を持たない場合に
本来割り切れるべき素数が検出されないため誤って素数と判定されます。
修正版では\frac{10^{12}}{2^{27}} \fallingdotseq 2450以下の素数での余りを求めるのにMOD関数ではなく
上記引用元の対策通りの式で求めるようにしてあります。
全部をその式に切り替えても良いのですがさすがにMOD関数の方が早いだろうと思って
想定範囲内で問題が出ない部分はMOD関数のままです
MOD関数のこの仕様は2010以降では無いため(上限が引き上げられているのだと思われますが)Excel2010以降では
以前の版でも問題はありません。
尚、動作確認については初版はExcel2013、本版ではExcel2016で行っています。