質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

5回答

10863閲覧

多倍長演算の理論

nnahito

総合スコア2004

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

2クリップ

投稿2015/04/18 17:14

お世話になっております。
「多倍長演算」の理論について詳しく知りたいです。

現在、(Double型でも)桁あふれが起こっており、多倍長演算なるものを利用しないといけない状況になっておりますが、いろいろ検索をかけてもよく分かりません。

まず言われているのが、
配列を使って、一桁ずつ計算する
というものを多く見かけました。

そのやり方を詳しく探そうとしていたところ、以下のサイト様を発見しました。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1082763270

そこを見ると、C言語で

lang

1void Mul(int x[],int y[],int z[]){ 2 int i,a,b,c; 3 a=10000; 4 for(i=N-1;i >= 0;--i){ 5 b=a+x[i]*y[i]; 6 z[i] = b % 10000; 7 a=b / 10000; 8 } 9}

と、あります。(理論は一切書かれていません)

これが多倍長演算というものなのでしょうが、どのような定理、理論を利用しているのでしょうか?

また、
*何故引数は配列であるか
*10000のあまりを利用したり、10000で割っているのは何故か
*(おそらく)2つの値の計算なのに、何故引数が3つ用意されているのか
などもご教授いただけると幸いです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

ボールドテキスト多倍長演算の実装の基本は、筆算での計算方法です。
一桁同士の足し算、引き算、掛け算(九九の表) があれば、筆算でいくらでも大きな数での計算が
紙の上で行えますよね。
その方法を 配列をつかって行うのです。

筆算では、1桁を 0...9 の範囲の 10 進として処理します。
多倍長演算の実装の場合は、0...999 として処理するといった工夫をします。
(1バイトは 1024 まであらわせるので)

掛け算や割り算では、筆算の方法より計算量が少なくできる方法があります。
Karatsuba, FFT, ニュートン法 ...

円周率の計算、暗号処理では、多倍長の演算が必要になります。

コンパクトに多倍長処理について説明されているページを web 上ではみつけられませんでした。
(多倍長処理についてはたくさんのページがみつかるのですが...)
自分の理解、疑問のレベルにあったページを探してみることをお勧めします。

投稿2015/04/18 22:08

編集2015/04/27 14:54
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnahito

2015/04/21 04:36

ご回答有難うございます. >一桁同士の足し算、引き算、掛け算(九九の表) があれば、筆算でいくらでも大きな数での計算が紙の上で行えますよね。 なるほど,この理論でやっているわけですね. >コンパクトに多倍長処理について説明されているページを web 上ではみつけられませんでした。 >自分の理解、疑問のレベルにあったページを探してみることをお勧めします ありがとうございます,探してみます
guest

0

http://fussy.web.fc2.com/algo/algo10-2.htm

ここが分かりやすいかなと思います。
10000で割ったり余りを求めたりしているのは、おそらく10000進数を使っているためだと思います。

投稿2015/04/18 23:35

naga3

総合スコア1293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnahito

2015/04/21 04:38

ご回答有難うございます. なるほど,進数を利用して桁数を下げるという考え方…盲点でした.
guest

0

参考に挙げられているサイトを見るとニュートン法を使う、と明記されています。ニュートン法についてgoogleで調べてみると、理論や計算機の数値計算に使用する例がいくつもヒットします。理論については私も説明できるほど詳しくないのでご自身で調べて理解された方がよいと思います。

>*何故引数は配列であるか
>*10000のあまりを利用したり、10000で割っているのは何故か
私も詳しいわけではないのでちゃんとした説明はできませんが、これらはニュートン法の理論に従って反復計算をするためのものだと思います。

>*(おそらく)2つの値の計算なのに、何故引数が3つ用意されているのか
3つ目の引数は結果を入れるものです。

あと、引用されているコードは演算の一部のみで、それだけでは答えは求められないと思います。参考サイトのコード全体をメイン関数から追ってみた方が理解が深まると思います。

投稿2015/04/18 18:02

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnahito

2015/04/18 18:19

ご回答有難うございます。 申し訳ありません、記載し忘れていました。 今のところ、まず乗算を利用したいと思い、 おそらく乗算の多倍長演算であろうMul関数を引用させていただきました。 >私も詳しいわけではないのでちゃんとした説明はできませんが、これらはニュートン法の理論に従って反復計算をするためのものだと思います。 申し訳ありません、見落としておりました。 なるほどこれがニュートン法なのでしょうか……
guest

0

コンパイルしていませんが、yahoo知恵袋のプログラム、正しく動かない気がします。

katoyさん、naga3さんの張っているリンクではどちらも乗算時にループ文がネストしています。
以下はkatoyさんの方のリンクから乗算部分だけを抜き出しています。

lang

1 for ( int v = 0; v < fig2; v++ ) 2 { 3 for ( int u = 0; u < fig1; u++ ) 4 { 5 ans[u + v] += x[u] * y[v]; 6 // 結果が2桁以上あれば,繰り上がり 7 if ( ans[u + v] >= 10 ) 8 { 9 ans[u + v + 1] += ans[u + v] / 10; // 繰上がり 10 ans[u + v] %= 10; // 残り 11 } 12 } 13 }

投稿2015/04/20 02:08

編集2015/04/20 02:09
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnahito

2015/04/21 04:38

ご回答有難うございます. 抜き出しありがとうございます. なんとなく見えてきました.
guest

0

誤送信

投稿2015/04/18 18:17

編集2015/04/18 18:17
nnahito

総合スコア2004

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問