Road Bike's Log

40歳からロードバイクを始めてPBP完走を目指すナウでヤングなお父さんのブログ

 

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

マイナンバー 検査プログラム

10月からマイナンバーの通知カードが順次送られてきますね。
当面は同梱されていると思われる返信封筒に申し込み用紙と写真を入れるとICチップ入りの個人番号カードが無料で発行されるので、皆さん是非忘れず申請しておきましょう。そのうち有料になると思います。
スマホで写真撮影してオンラインでも申請できる予定みたいです。

ところで、個人用マイナンバーは12桁の数字になる予定ですが、1の位はチェックディジットになるようです。
番号法に関する総務省令の第5条に算式が掲載されています。

〜まんま引用〜

第五条  令第八条の総務省令で定める算式は、次に掲げる算式とする。
算式
 11―(n=1(シグマ)11(Pn×Qn))を11で除した余り)
 ただし、(n=1(シグマ)11(Pn×Qn))を11で除した余り≦1の場合は、0とする。
算式の符号
 Pn 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を1桁目としたときのn桁目の数字
 Qn 1≦n≦6のとき n+1 7≦n≦11のとき n―5



私立文系なのでイマイチ何を言ってるのかよくわかりませんが、

11
Σ(Pn x Qn)
n=1

ってのが大雑把な数式みたいです。
Σってのは、自分にはクリンゴンバードオブプレイに見えますが、シグマと読んで何かを足し算する記号のようです。
上下にコバンザメみたいなのがくっついていますが、下は変数の初期化、上がループ数の指定と言った理解でよろしいんでしょうか。
Pは個人番号の各桁から取り出した数値でQは条件付きでカウントアップ、ダウンされる数値のようです。あとは色々条件が付いてますね。

例えばマイナンバーが123456789018である場合、上から11桁を取り出して最下位がP1となるので、この場合1ですね。
その時のQは2という事かと思います。
結構簡単な計算なのでエクセルなど使えば一瞬でチェックする仕組みが作れますね。

で、せっかくなのでTI-84でチェックできるプログラムを作ってみました。
一般的なベーシック等とはちょっと違う文法なのでこちらのページで基本的なプログラミングをざっとお勉強しました。ステップバイステップで大変わかりやすく解説されていて良いと思います。


で、出来上がったのがこのプログラム。


Lbl H ←追加 しおり付けます
ClrHome ←画面まっさらにします
Lbl 1 ←しおり付けます
Disp "INPUT NUMBER 
Input ": ",N
If N>999999999999 or N<100000000000 ←12桁以外エラー出します
Then
Output(4,3,"ERROR!")
Output(6,4,"ENTER 12 DIGITS"
Pause
ClrHome
Goto 1 ←エラー出したらしおりに戻ります
Else
int(N/100000000000)→A ←こっからひたすら力技。
int(N/10000000000)-10A→B
int(N/1000000000)-100A-10B→C
int(N/100000000)-1000A-100B-10C→D
int(N/10000000)-10000A-1000B-100C-10D→E
int(N/1000000)-100000A-10000B-1000C-100D-10E→F
int(N/100000)-1000000A-100000B-10000C-1000D-100E-10F→G
int(N/10000)-10000000A-1000000B-100000C-10000D-1000E-100F-10G→H
int(N/1000)-100000000A-10000000B-1000000C-100000D-10000E-1000F-100G-10H→I
int(N/100)-1000000000A-100000000B-10000000C-1000000D-100000E-10000F-1000G-100H-10I→J
int(N/10)-10000000000A-1000000000B-100000000C-10000000D-1000000E-100000F-10000G-1000H-100I-10J→K
int(N-100000000000A-10000000000B-1000000000C-100000000D-10000000E-1000000F-100000G-10000H-1000I-100J-10K→L
A*6+B*5+C*4+D*3+E*2+F*7+G*6+H*5+I*4+J*3+K*2→M ←ここがΣ(Pn x Qn)の部分
If remainder(M,11)≤1 ←11で割ると余りが1以下の答えは0をセット
Then
0→Z
Goto 2 ←追加 ※これが無いと余りが1以下の場合ここでプログラムが停止するため
Else
11-remainder(M,11)→Z ←11で割った余りをセット
Lbl 2 ←追加 ※上記Gotoの行先
Disp "
Disp "Σ(P*Q)=",M
Disp "CHECK DIGIT =",Z
If L=Z
Then
Output(8,2,"=== OK! ==="
Pause
Goto H ←追加 先頭に戻ります
ClrHome ←削除
Else
Output(8,2,"*** WRONG! ***"
Pause
ClrHome ←削除
Goto H ←追加 先頭に戻ります


ざっくりとこんな感じです。
配列とか使ってなんとかしてみようと思ったけどやり方がわからなくて力技で実現しました。
コードは美しくないし動作確認もちょっとしかしてないので挙動は怪しいです。間違いが見つかったら適宜修正しますが、なんか気づいたらコメントで連絡ください。
そもそも計算方法が間違っているかもしれませんが(^^;
ごちゃごちゃ書いてあるのは見た目をちょっと綺麗にするための部分が多いです。

あと、この言語はリソースの少ない電卓用に命令が工夫されていて、クオーテーションやブレースの締め側を省略することができます。
例えば上のコードの中で、
Output(6,4,"ENTER 12 DIGITS"
て部分は最後の括弧を付け忘れていますがきちんと動きます。TI-84 Plus CEはメモリが大幅に増設されたから今回は見て直感的に分かりやすいように全部閉じてコードを書く方針でやりましたが、プログラムをコンパクトにするにはどんどん省略できるものは省略したほうが良いみたいです。
若干動きも速くなるのではないかと思います。


画面イメージはこんな感じです。

Capture 1_20150810
起動直後。ナンバー入れろと言ってプロンプトで促します。


Capture 5_20150810
12桁に満たないと12桁入れろってエラー出します。


Capture 4_20150810
12桁を越えても同じエラーです。


Capture 2_20150810
検算結果が合わない場合は間違い警告を出します。
一応 Pn x Qn の合計値とチェックディジットの数値も表示させました。


Capture 3_20150810
12345678901のチェックディジットは8になるようです。
という事で間違ってなければOKを出します。

動画撮影してみました。
初期プログラムなので追記後の動作はしていません。

さすがバックライト入りフルカラー液晶、明るいですね。
しかしテカってよく見えませんね(^^;


実際にマイナンバーを扱う際は厳重に管理しないといけないからエクセルでも管理しない予定だけど、今回は初回で大量に入力をしないといけないのでディジットチェック機能付きエクセルワークシートを作成しました。
そいつから管理システムに取り込みすれば多分早いですね。おそらく管理システムもメーカーがチェックディジットの機能を実装してくるかと思いますが、まあ作っておいて損はないからいいか。

で、計算機にこいつを入れるメリットは思いつきませんが、出先で見せられた個人番号カードが偽造じゃないか確認するぐらいでしょうか。
まだ始まってみないとわからないから今の所なんともわかりませんね。



<2015/8/11修正>

例えば444444444444の場合チェックディジットが0になって、最初のプログラムだとその時点で処理が終了する不具合があったのでGotoとLblを付けて修正しました。


<2015/8/12追記>

計算方法について

int(N/100000000000)→A
int(N/10000000000)-10A→B


こんな感じで各桁の数字を取り出していますが、プログラム内では下記のように計算されています。

123456789012/1000000000000=1.23456789012
これの整数部分(integer)のみ取り出すためintで少数以下を破棄して変数Aに1がセットされます。
次に123456789012/100000000000=12.3456789012となり、intにより12が取り出されるので、
そこから上位で計算したAの値を1桁シフトして10とし、12-10をすることで2を取り出します。
それ以降はこれを桁シフトを繰り返してどんどん連ねて、123456789012を1個ずつ取り出してA〜Lにセットしています。


<2015/8/20追記>

以前は計算が終了するとプログラム自体も終了していましたが、連続して動くように計算結果表示後にエンターを押すと最初に戻るようにしました。
終了させるには[2nd]+[quit]でプログラムから抜けます。


<2015/12/2追記>

マイナンバーが届きだしました。
扶養者のマイナンバーに記入間違いがないか確かめるために活用していますが、頭が0のマイナンバーだとエラーがでます。
突貫工事で修正するには、5行目の「If N>999999999999 or N<100000000000」部分の後ろの0を1個削ると計算してくれます。
ただし、11桁でもエラーを表示せずに計算してしまうので、時間があるときに別の方法を考えようと思います。

 
Comments
 
わーぃ
ビール飲んだのに醒めちゃいました。
素面の時に、復習しときます(;^ω^)
 
>tenyuさん

ひょっとしたらWindows10より高性能な計算機かもしれませんよ(^^)/
スリープからの復帰の速度と正確さは目を見張るものがあります。

Body
プロフィール

ゆあんこカロとー

Author:ゆあんこカロとー
自転車
 Cinelli Pro ESTRADA 
 Cannondale CAAD8 5 105
 RALEIGH Carlton N

イベント参加記録
2014
 AR中部 BRM315 200km 12h25m
 完走 (CAAD8)
 AR中部 BRM412 300km 18h21m
 完走 (CAAD8)
 ツール・ド・西美濃 120km
 完走 (ESTRADA)
 AUDAX近畿 BRM1004 200km 11h38m
 完走 (ESTRADA)
 鈴鹿エンデューロ 2014/11/15
 4Hロード 146位 (ESTRADA)
2015
 AUDAX近畿 BRM418 200km 11h09m
 完走(ESTRADA)

年別アーカイブ
検索フォーム
ブロとも申請フォーム
QRコード
QR
ランキング

123456789101112131415161718192021222324252627282930 06
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。