• ベストアンサー

モジュロ2除算ってどうやるの?

情報処理の勉強をしてるのですが、CRCを算出する時の過程でモジュロ2除算というのを使うと書いてあります。 その中でこのように書かれているのですが、この計算の意味がわかりません。 X11+X10+X7 ÷ X6+X2+1 = X5+X4+1 余り…X5+X4+X2+1 モジュロ2除算って、どうやって計算するんですか? 教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

まずは予備知識から。 ---------- 例えば整数を3で割ると 「割り切れる」か「1余る」か「2余る」か、のいずれかです。 すなわち、余りは「0.1.2」以外にはありません。 それでは「-7」を3で割るとどうなるでしょうか? (-7) ÷ 3 = (-2) 余り (-1)? これは間違いとは言いにくいですが、 余りは「0,1,2」しか許されないとすれば (-7) ÷ 3 = (-3) 余り 2 とするのが良いですね。 これは、数直線上に等間隔に整数をとって、 その下に余りを「0,1,2,0,1,2,……」と書いていき、 負の整数に対しても同様に延長すれば納得できます。 ---------- ご質問の除算を、全く普通に行なえば (x^11 + x^10 + x^7) ÷(x^6 + x^2 + 1) = (x^5 + x^4 - 1) 余り (- x^5 - x^4 + x^2 + 1) となります。これなら分かりますね。 ここで係数だけを取り出すと、 (1 1 0 0 1 0 0 0 0 0 0 0) ÷ (1 0 0 0 1 0 0) = (1 1 0 0 0 -1) 余り (-1 -1 0 1 0 1) となります。被除数(割られる数)と余りだけを対応させると、 (1 1 0 0 1 0 0 0 0 0 0 0) → (-1 -1 0 1 0 1) すなわち、「110010000000」というデータがあったとき、 これらを係数に持つ多項式(x^11 + x^10 + x^7)を作り、 あらかじめ用意しておいた別の多項式(x^6 + x^2 + 1)で割った余りを計算し、 その係数を再びビット列に直して記録しておくわけです。 このとき、コンピュータは0か1しか格納できませんから、 これら以外の係数が現れたら偶数は0に、奇数は1に変換します。 これは言い換えれば、2で割った余り(modulo 2)を考えていることに相当します。 すなわち、上の例で得られた係数はさらに (-1 -1 0 1 0 1) ≡ (1 1 0 1 0 1)と変換され、 ビット列「110101」が格納されます。 これを多項式に書き戻すと、 ご質問のような一見奇妙なmodulo除算ができあがります。 CRCでは、この余分な(= 冗長な)ビット列をチェックすることによって、 データ転送の誤りを検出するわけです。

その他の回答 (3)

  • nubou
  • ベストアンサー率22% (116/506)
回答No.4

私の回答は商ではなく余りの求め方でしたが 符号理論にとっては商はほとんど意味なくて あまりの方が重要なのです 従って商は捨てるようにして余りを求めるのが普通です

  • nubou
  • ベストアンサー率22% (116/506)
回答No.2

mod(2)の世界では0と1しかなく2は0とみなします 引き算も足し算も同じです x^11+x^10+x^7をx^6+x^2+1で割る場合には まず 最高次数x^11に着目してx^6+x^2+1にx^5を掛けて最高次数を同じにしてx^11+x^10+x^7から引き(=に足し)ます そうするとx^11+x^10+x^7の次数が下がります このような操作をx^11+x^10+x^7の操作結果の次数が6未満になるまで繰り返します その操作の最終結果が (x^11+x^10+x^7)÷(x^6+x^2+1)です

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

2進数で割り算をやりますが、桁ごとの引き算に関して1つだけ特別な約束があります。 0-1=1とします。(この約束を使う除算がモジュロ2除算です) モジュロと言うのは余りと言う意味のようです。余りだからマイナスは許さないので 2を足してプラスにすると言うことのようです。 後は、上記の式を(2^11+2^10+2^7)÷(2^6+2^2+2^0) と考えて割り算していきます。 上記の(0-1=1)は例えば「0-2^5=2^5(0-1)=2^5」というような形であらわれます。 頑張って下さい。判りにくければ補足してください。

関連するQ&A

  • モジュロ除算について教えて下さい。お願いします。

    現在、CRC演算回路(Cyclic Redundancy Check)の勉強をしているのですが、モジュロ2除算というものがよくわからないので、教えて下さい。何か、Ex-ORを使用して演算しているのですが、どうしてそのような演算結果で、余りが出るのかわからないので、よろしければ、詳しく教えて下さい。よろしくお願いします。

  • データ伝送の誤り訂正の技術について

    誤り訂正の技術の1つであるCRC演算回路について勉強しているのですが。その中で、Ex-ORを使った、モジュロ2除算というものが出てきたのですが、どうもいまいち納得できないので、教えて下さい。どうしてEx-ORを用いることによって、余りのを出す事が出来るのですか?どこまで(何回)演算すれば、その余りをCRCコード(伝送時に誤り訂正として付属するもの)として利用できるのですか?私はかなりの初心者なので、出来れば詳しく教えて下さい。宜しくお願いします。

  • CRC8 ATMの計算方法

    CRC8 ATMの演算を行うツールの検証を行っているのですが、 CRCの机上計算方法を詳しく解説したサイトが無く生成多項式で 割って余りを求めると言う事しかわかりませんでした。 CRCを求める際はCRCの初期値も重要な筈ですが、CRCの初期値は 余りを求める際にどの様に使うのかを開設した物がなく、私に 検証を依頼してきた人に聞いてもまともな回答をもらえません でした(検証を依頼してきた人もちゃんと理解していない?)。 このサイトの別の質問の回答で 1. 与えられたデータの下位 (ビット送りの反対側) に「初期値」   を付加する 2. 生成多項式で割って余りを求める とあったので、その通りに計算しましたが初期値が0x00の時は ツールと机上計算の結果が一致するのですが、初期値0xFFの時は ツールと机上計算の結果が一致しませんでした。 実際の計算過程と結果は下記です。 生成多項式:x8+x2+x1+1(9'b100000111) 入力データ:0x12345678 CRC初期値:0x00 データ左送り、入出力反転なし 机上計算 初期値:0001001000110100010101100111100000000000(0x1234567800) 100000111 ---------------------------------------- 0001001000100010101100111100000000000 100000111 ---------------------------------------- 0001001010010101100111100000000000 100000111 ---------------------------------------- 0001011100101100111100000000000 100000111 ---------------------------------------- 0011101011100111100000000000 100000111 ---------------------------------------- 01101000000111100000000000 100000111 ---------------------------------------- 0101001110111100000000000 100000111 ---------------------------------------- 001001001111100000000000 100000111 ---------------------------------------- 0001000001100000000000 100000111 ---------------------------------------- 0000000010000000000 100000111 ---------------------------------------- 00000011100 なのでCRC(余り)は0x1C(00011100)でツールの結果0x1Cと一致。 CRC初期値:0xFF 机上計算 初期値:0001001000110100010101100111100011111111(0x12345678FF) 100000111 ---------------------------------------- 0001001000100010101100111100011111111 100000111 ---------------------------------------- 0001001010010101100111100011111111 100000111 ---------------------------------------- 0001011100101100111100011111111 100000111 ---------------------------------------- 0011101011100111100011111111 100000111 ---------------------------------------- 01101000000111100011111111 100000111 ---------------------------------------- 0101001110111100011111111 100000111 ---------------------------------------- 001001001111100011111111 100000111 ---------------------------------------- 0001000001100011111111 100000111 ---------------------------------------- 0000000010011111111 100000111 ---------------------------------------- 00011100011 なのでCRC(余り)は0xE3(11100011)でツールの結果0xCDと不一致 となりました。 これは計算の仕方が間違っているのでしょうか? それともツールの結果が間違っているのでしょうか? 何方かCRCの計算に詳しい人、ご回答をお願いします。

  • 算術演算子にて、整数での除算処理は商になる?

    JAVAのプログラミングを勉強しているのですが、JAVAの算術演算子にて、 参考書に「除算演算子は割り算を行うものだが、整数同士の割り算を用いると「商」を計算する」と書かれているのですが、これはどういう意味でしょうか? 整数同士の割り算をすると、小数点ではなく四捨五入をした整数値が出力されるのでしょうか?

    • ベストアンサー
    • Java
  • CRC16計算について

    CRC16のプログラムを作ったのでデバッグしていて気付いた事なのですが (産業装置で使うMODBUS-RTUのソフト) CRC16 x16+x15+x2+1 生成多項式 0xA001 CRC16でCRCを含めたデータを再CRCするとゼロになると言われておりますが そうならないのですが何故でしょう? もちろん、自分の作ったソフトが信用できないので他ソフトで検証 具体例 ベクターにあるCRC16の計算ソフト - CRC16.exe http://blog.goo.ne.jp/masaki_goo_2006/e/50b20edb79f60964faeaefe6fa064469 これに文字列"ABCD" [0x4142,0x4344]を入れて計算実行 出力結果  初期値:0xFFFF、出力XOR:0xFFFF、出力結果、右送り0x0F85 この出力を最初の文字列に追加する 0x4142,0x4344,0x0F85 結果は0xc7e6 となってゼロになりません やりかたが違うのでしょうか? 尚、私の作ったプログラムと上記ソフトの結果が同じです また、ネット上にある同様な他ソフトでも同じ結果でした (もちろんCRC計算条件が同じ物) 尚、上記ソフトで 初期値:0x0000、出力XOR:0x0000、左送り:9AA8 この場合のみCRC追加しての再CRCはゼロになりました ゼロになる場合とならない場合があるのでしょうか?

  • x1とx2を独立、同一に分布している(iid)

    x1とx2を独立、同一に分布している(iid) (1)連続のランダム変数 (2)離散のランダム変数 だとします。 (1),(2)においてP[x1<=x2]は計算できるのでしょうか。 計算できるならば計算の仕方、値を算出できないのならばその理由を知りたいです。

  • 教えてください・・・

    簿記の中で出てきた計算なんですが、 (X-50000)+(80000+X)+8465000=8668700 x-102600 この式なんですが恥ずかしながら意味がわかりません。どういった過程 でこうなったんでしょうか?

  • 2線の交わる角度を求める式

    2線の交わる角度を求める式で、0での除算が発生しない方法を教えて下さい。 座標 線a ax1 = 0 , ay1 = 0 : ax2 = 12 , ay2 = 13 線b bx1 = 6 , by1 = 15: bx2 = 6 , by2 = 2 A=(y13-y0)/(x12-x0) B=(y2-y15)/(x6-x6)   0で除算が発生 2線の交わる角度 tanθ=(A-B)/(1+AB) 片方の線が垂直だと0で除算が発生しまい、うまく計算できません。 なにか他によい方法はないでしょうか。

  • 10÷(-5)x(-2)÷3分の1

    こんばんは、みなさん。 私は、今中学一年生の数学をしているのですが 何度やっても、何度考えても 正しい答えをだすことができなかったので 先輩方に教えていただきたいことがあります。 それは、10÷(-5)x(-2)÷3分の1という 問題なのですが、私の答えは3だと 思うのです。 その過程は、かっこを先に計算するため (-5)x(-2)=10となりますよね そして、10÷10÷3分の1としました なので答えは、3です。 しかし、問題集の答えを見ると12 なのだそうです。 そこで思ったのが、10÷10÷3分の1=3で 正しいけど、10÷(-5)x(-2)÷3分の1というのは、 10÷10÷3分の1という計算過程にしては いけないのかな、と思ったことと そうではなく10÷10÷3分の1=3ではないことや 問題集の答えの12が、間違いなのではないのかな とおもったり、いろいろ考えてみましたが わかりませんでした・・・ それから、問題集の計算過程は このようになってましたが このような方法にしなくてはならないのでしょうか? この問題の正しい計算過程を 教えてくださいませ、よろしくお願いします・・・ 10x2x3 ------ =12 5x1

  • 限界代替率の求め方が分かりません

    効用関数U=U(X1,X2)=3X1^2/3X2^4/3について、この効用関数をもとにした限界代替率を求めなさい。 このような問題が出たのですが、解き方が分かりません。 できれば過程とともに教えてほしいです。お願いします。 3X1^2/3は、3Xの1の2/3乗という意味です。 X2^4/3は、Xの2の4/3乗という意味です。