基本情報のチェックディジットを重みと余りの例題で理解する

木製キューブの列と末尾の確認用の駒を虫眼鏡で確かめるイメージ

基本情報のチェックディジットは、各桁に指定された重みを掛けて足し、問題文の規則に従って検査用の数字や文字を求める仕組みです。計算で迷いやすいのは掛け算よりも、どちらの端から重みを付けるか、余りをそのまま使うか、補数を使うかという条件の読み取りです。

先に元の桁と重みを対応させた表を作れば、検査文字の計算、付加済みコードの検算、分からない桁の逆算を同じ手順で進められます。この記事では独自の短い架空コードを使い、途中式と答えを確かめます。実在の商品コードや個人番号を示す例ではありません。

この記事のポイント
  • 検査文字は元の番号から計算して付け、入力時の再計算で照合する
  • 重みの向きと検査桁の扱いは、方式名の暗記より問題文の指定を優先する
  • 余りを使う方式と、合計を10の倍数にする補数方式を例題で区別する
  • 未知桁が複数候補になる場合と、検出できない誤りを計算で確認する
無料

基本情報技術者試験 過去問アプリ

本番形式で繰り返し解ける。スキマ時間に1問から

2,000問以上収録
無料で過去問を解く
目次

基本情報のチェックディジットの仕組み

整列した木製キューブの末尾に青い確認用の駒を置いた様子

検査数字は入力の照合に使う

チェックディジットは、元になる番号の各桁から決められた計算で求める検査用の桁です。検査数字とも呼ばれ、数字に収まらない計算結果を文字へ対応させる問題では、検査文字という呼び方も使われます。ここでは計算結果をc、計算に使う元の部分をデータ部と呼びます。

生成する側はデータ部からcを計算し、指定の位置へ付加します。入力を受け取る側は、読み込んだデータ部に同じ規則を適用して、再計算した値と付加されているcを比べます。一致しなければ、その規則を満たしていないため、入力のやり直しなどにつなげられます。

ただし、一致することと、番号が本当に発行されていることは別です。規則に合う番号は計算だけでも作れてしまいます。商品や利用者が登録済みかを確かめるには、別途データベースとの照合が必要です。チェックディジットだけで本人確認や改ざん防止ができるとは考えないようにしましょう。

また、計算が合わなかったときに、どの桁をどう直せばよいかまで分かるとは限りません。「誤りを見つける」と「元の番号へ訂正する」を分けておくと、後半の未知桁の問題も理解しやすくなります。逆算の例題では、分からない位置や他の桁が正しいことを条件として与えます。

基本情報の学習では、数字だけを許す検査や桁数の検査とも区別します。IPAの基本情報技術者試験シラバスも、画面設計の入力チェックの用語例にニューメリックチェック、フォーマットチェック、チェックキャラクターなどを挙げています。

重みとmodを一つずつ読む

区画ごとに金属ワッシャーを分けて対応を整理した様子

重みは各桁に掛ける係数です。たとえば架空の4桁データ4823へ、左から2、3、4、5を掛けると指定されたら、4×2+8×3+2×4+3×5を計算します。4823を一つの整数として係数倍するのではなく、桁ごとに分ける点が大切です。

各積の合計をSと置くと、この例ではS=8+24+8+15=55です。重みが位置ごとに異なるため、同じ数字が含まれるコードでも、並び方が変われば合計が変わる場合があります。掛け算を暗算で続ける前に、数字の真下へ重みを書いて対応を固定しましょう。

modは割り算の余りを求める演算です。55 mod 11=0は、55を11で割った余りが0という意味です。55 mod 9=1なら55=9×6+1と確かめられます。答えに使うのは商の6ではなく余りの1です。割る数がmのとき、非負整数の余りは0以上m未満になります。

「11で割るから余りは1から11」と考えるのも誤りです。余りは0から10までなので、0と10がどちらも候補に入ります。もし余り10をXなどに置き換えるなら、それは別に定めた文字対応の規則です。mod 11という指定だけから、10の扱いまで推測してはいけません。

スクロールできます
読み取る条件確認したい点
計算対象検査桁を除いたデータ部か、付加済みコード全体か
位置の基準左端か右端か、検査桁を1桁目として数えるか
重み各桁に何を掛けるか、繰返しの周期があるか
余りの使い方余りそのものか、補数か、文字への変換があるか
境界の処理余り0や10をどのように表すか

コードの先頭に0があるときも、固定長の桁として指定されていれば消しません。たとえば0423の先頭は値0なので積には寄与しませんが、桁の位置は占めています。左から重みを対応させるのに0を取り除くと、残りの桁へ別の係数を掛けることになります。

余り方式と補数方式を分ける

木球の入ったケースと空き区画のあるケースを並べた様子

同じデータと重みを使っても、合計Sを求めた後の規則によって検査数字は変わります。分かりやすい比較として、S=27、割る数を10とします。余りrは27 mod 10=7です。ここから「余りをcにする」ならc=7、「S+cを10の倍数にする」ならc=3になります。

後者で求めているのは、次の10の倍数まで足りない分です。27に3を足すと30になるので、3が補う数字になります。「チェックディジットは余り」とだけ覚えると、この二つの方式を取り違えます。どちらも問題で定義できるため、名称だけで計算方法は一つに決まりません。

スクロールできます
この例題での方式生成規則S=27の答え検算
余りをそのまま使うc=S mod 107データ部から求めた余り7と付加値7を比較
10の補数を使うc=(10-(S mod 10)) mod 103(S+c) mod 10=0を確認

補数方式の式に最後のmod 10が付くのは、Sが最初から10の倍数ならcを0にするためです。S=40では余り0、足すべき数も0です。10-0=10をそのまま1桁の検査数字として書くわけではありません。問題文が「余り0のときは0」と場合分けしていれば、その指示と同じ働きです。

実際の方式の一例が、商品識別コードのGTIN-13(JANコード)です。GS1 Japanの公式ガイド17ページでは、検査桁を含めた右端を1桁目として、データ部の偶数桁側を3倍し、奇数桁側と合算して下1桁を10から引く方法と、下1桁0なら検査数字0とする扱いが説明されています。

これはGTIN-13についての説明で、すべての検査数字に共通する公式ではありません。また、検査桁をまだ付けていないデータ部だけで右から数えると、重み3の側は1、3、5桁目になります。数え始める対象が一つ違うだけで奇数・偶数の呼び方が入れ替わるため、言葉より実際の位置を確かめましょう。

誤りがあっても一致する場合

色順の違う小石の列に同じ青いガラス玉を添えた様子

検査結果の候補が少なければ、異なるデータが同じ結果になることがあります。これをここでは同じ剰余への衝突として考えます。元のデータを短い結果へまとめている以上、検査値が同じだからといって、元の全桁が同じとは断定できません。

独自の2桁データに左から重み1、3を掛け、mod 10の余りをcにする規則を考えます。単純に数字を足すだけなら、順序を入れ替えても和は変わりません。重みが違えば順序によって合計が変わる場合がありますが、それでも余りが必ず変わるとは限らないのが注意点です。

同じ規則で、データ16は1+18=19でc=9、データ61は6+3=9でc=9です。元の16を61へ入れ替え、末尾の検査数字9を変えなくても検算に通ります。合計の差が10で、mod 10では同じ余りになるためです。この規則は、この入れ替わりを検出できません。

一方、12を21へ入れ替えた場合は、元の余り7に対して2+3=5の余り5となるため、不一致を検出できます。「重みを付ければ入れ替わりをすべて検出できる」でも「入れ替わりは何も検出できない」でもなく、重みと数字の組合せに依存します。

1桁だけの誤りも、規則を示さずに必ず検出できるとは言えません。たとえば重み2の桁で0を5へ変えると、合計の変化は2×5=10です。mod 10の結果は変わりません。反対に、この節の重み1と3では、1桁だけの0〜9の別の数字への変化は余りを変えます。この違いは、変化量に重みを掛けた結果が割る数の倍数になるかどうかで判断できます。

ビット列に付ける検査の学習へ進む場合は、基本情報のパリティチェックと誤り検出の限界が関連します。ここでは10進の各桁と重みを扱い、パリティの記事ではビットの1の個数を扱うので、計算対象を分けて読み進めてください。

基本情報のチェックディジットを計算する

区画付きケースへ無地の立方体を順番に並べる手元

余りを使う問題は表から解く

ここからは、実在の規格を表すものではない独自の演習です。4桁の架空データ3524に、左から重み2、3、4、5を掛けて合計し、11で割った余りを検査文字とします。この演習だけの規則として、余り0〜9は同じ数字、余り10はXと表すことにします。

スクロールできます
左からの位置データの数字重み積
1桁目326
2桁目5315
3桁目248
4桁目4520
合計——49
STEP
対象と重みを対応させる

検査文字を付ける前の3524だけを対象にし、左から2、3、4、5と対応させます。まだ存在しない末尾の検査文字を積へ混ぜません。

STEP
積を足して余りを求める

S=6+15+8+20=49です。49=11×4+5なので、49 mod 11=5です。

STEP
規則に沿って検査文字にする

この演習は余りをそのまま使うのでc=5。末尾へ付加すると、データ3524と検査文字5からなる35245になります。

検算では末尾5をいったん分け、データ部3524から求めた余り5と比べます。付加後の5桁へ同じ重みを延長して掛ける計算ではありません。この例ではデータ部の合計49にcの5を足しても54となり、11の倍数にはなりません。余りを付加する方式と、合計を割り切れるようにする方式は検算も違います。

文字変換の境界も確かめましょう。同じ重みでデータ3525ならS=6+15+8+25=54、54 mod 11=10なので、付ける文字はこの演習の指定に従ってXです。末尾を2桁の10にしてコードを延ばすのではありません。問題に対応表があるときは、数値計算を終えてから文字へ変換します。

補数方式と余り0を確かめる

一つ空きのあるホルダーと木球で埋まったホルダー

次は別の独自演習です。架空の4桁データ4823に左から重み1、3、1、3を掛け、S+cが10の倍数になるよう、0〜9の検査数字cを末尾へ付加します。この演習では、付加する検査桁の重みを1とします。先ほどのmod 11の規則を持ち込まないようにしましょう。

スクロールできます
対象左から1桁目左から2桁目左から3桁目左から4桁目
データ4823
重み1313
積42429

積の合計はS=4+24+2+9=39です。39 mod 10=9なので、次の10の倍数40まで足りない数は1です。c=(10-9) mod 10=1となり、付加済みの架空コードは48231になります。検算すると39+1=40、40 mod 10=0です。

この問題で9と答えたなら、余り自体は正しく求められています。取り違えているのは、その後に補う操作です。途中式を「S」「余りr」「最終値c」の三つに分けると、計算ミスなのか、方式の読み違いなのかを切り分けられます。

余り0の例として、データ4820を同じ規則で計算します。S=4+24+2+0=30、r=0です。すでに10の倍数なのでc=0、付加済みコードは48200となります。末尾にデータの0と検査数字の0が続いても、最後の1桁が検査桁という区切りは変わりません。

もう一つ、先頭に0を含む0423なら、S=0×1+4×3+2×1+3×3=23です。c=7を付けた04237が、この演習の固定長コードになります。0423を423として左から1、3、1を掛けると別の規則になってしまうので、先頭の0も表へ残します。

補数方式の検算でS+cと書けるのは、この演習で検査桁の重みが1だからです。問題が検査桁を含めて別の重みを指定していれば、その重みまで式に反映します。検査桁を計算に含むかどうかを省略したまま、すべての方式で「全桁の和の余り0」と覚えるのは避けましょう。

付加済みコードから未知桁を探す

列の空いた一か所と二つの候補ブロックを見比べる配置

同じ補数方式で、受け取った架空コードが48231なら、データ部4823と検査数字1に分けます。データ部の重み付き合計39に1を足して40になれば、規則に一致しています。もし48241と入力されていたら、データ部の合計は4+24+2+12=42、検査数字込みで43となるため、不一致を検出できます。

ここで「どこかに入力誤りがある」と判断できても、必ず4桁目が誤りだと特定できるわけではありません。今は元の48231を知っているから比較できますが、入力先では元の番号が分からない場合があります。エラー検出の結果から、勝手に末尾だけを再計算して上書きすると、誤ったデータ部を正しいものとして受け入れてしまいます。

逆算の問題では、未知の位置が明示されます。データを4×23、検査数字を1とし、xは0〜9の整数、他の桁は正しいとします。重みは左から1、3、1、3なので、検査数字まで含む合計は4+3x+2+9+1=16+3xです。これが10の倍数になるxを探します。

候補0〜9を入れると16、19、22、25、28、31、34、37、40、43となります。10の倍数はx=8のときの40だけなので、未知桁は8です。16+3x=0と普通の等式にしてはいけません。必要なのは合計そのものが0になることではなく、10で割った余りが0になることです。

ただし、未知桁が一つなら答えも必ず一つになる、という法則はありません。別の架空演習として、データを2x、重みを左から1、2、検査数字を2とし、合計2+2x+2=4+2xを10の倍数にする規則を考えます。0〜9を調べると、x=3なら10、x=8なら20で、両方とも規則に一致します。

スクロールできます
逆算する条件候補の確認結論
(16+3x) mod 10=0、0≦x≦9x=8で40、他の候補は割り切れないx=8に一意に定まる
(4+2x) mod 10=0、0≦x≦9x=3で10、x=8で20x=3または8で、条件が足りない

後者では、データ23に検査数字2を付けた232も、データ28に同じ2を付けた282も検算に通ります。これは重み2の位置で3と8の差5を掛けると、合計差が10になるためです。一意に定まらなければ、範囲や追加条件を読み直す必要があり、都合のよい方を答えに選ぶことはできません。

試験では選択肢を候補として代入するのも有効です。ただし、最初に式と桁の範囲を確定してから使います。候補が複数通るときは重みの読み違いや条件の見落としを点検し、それでも複数なら「一意に決まらない」という状況をそのまま認識しましょう。

練習問題を生成と検算で解く

二列に並べた無地の積み木を照合するための配置

最後に、方式を自分で見分けるための独自問題を三つ用意しました。いずれも実在の番号体系とは関係のない架空コードです。先に「余りを使うのか、補数を使うのか」を短く書き、答えを求めたら元の指定へ戻って検算してください。

問題A:データ271の各桁に、左から重み2、4、3を掛けて合計します。7で割った余りをそのまま検査数字として末尾へ付けるとき、検査数字と付加後のコードを求めてください。検査数字は重み付き合計の計算に含めません。

解答は、S=2×2+7×4+1×3=4+28+3=35、35 mod 7=0なのでc=0です。付加後は2710になります。余り0も正しい結果なので、空欄にしたり、割る数の7へ置き換えたりしません。データ部を再計算した余り0と、末尾の0が一致することが検算になります。

問題B:データ631へ左から重み1、3、1を掛け、合計に検査数字cを足して10の倍数にします。cの重みは1、範囲は0〜9です。cはいくつでしょうか。また、付加済みコードが6324だった場合は検算に通るでしょうか。

解答は、S=6+9+1=16なのでc=4、付加後は6314です。元のコードなら16+4=20で一致します。一方6324ではデータ部が632なのでS=6+9+2=17、17+4=21です。21 mod 10=1となり、規則に一致しないため誤りを検出します。

問題C:2桁データに左から重み1、3を掛け、mod 10の余りを末尾へ付加します。架空コード169のデータ部を入れ替えて619にした場合、この検査で誤りを検出できるでしょうか。どの合計を比べればよいかも考えてみてください。

解答は、16では1+6×3=19で余り9、61では6+1×3=9で余り9です。付加されている検査数字も9なので、どちらも照合に通り、入れ替わりは検出できません。元と合計が違うことだけでは不一致にならず、余りが同じかどうかが判定を決めています。

Aは余り方式の0、Bは補数方式の生成と入力後の検算、Cは同じ剰余に入る誤りを確かめる問題です。間違えたときは、答えの数字だけを覚えず、データ部の取り出し、重み、合計、余り、最終変換のどこでずれたかを確認すると、次の別ルールの問題にも応用できます。

基本情報のチェックディジットのまとめ

基本情報のチェックディジットでは、規則を読み取って各桁と重みを対応させることが出発点です。その後で合計を求め、余りをそのまま使うのか、合計を割り切れるように補うのかを分けます。付加済みコードを調べるときも、生成規則に対応した方法で照合します。

  • 検査桁を含めるか、重みをどちらから付けるかを最初に確認する
  • 余り0と、文字への変換などの境界条件を計算の最後まで守る
  • 未知桁は0〜9など指定された範囲ですべての候補を確かめる
  • 検算に通っても、正しい元データ・実在・本人性まで保証されるとは考えない

まずは練習問題の数字を変えずに、途中式を隠して解き直してみましょう。次に重みや割る数だけを変え、同じ手順を使えるか確かめます。方式を丸暗記するよりも、与えられた規則で生成と検算の両方を説明できる状態を目指すと、初めて見る問題でも判断しやすくなります。

解説を読んだら、基本情報の過去問アプリで無料演習に進み、答えだけでなく選んだ理由も確かめてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次