C++の機能だけで多倍長計算を考えるスレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG0153146
NGNGRSA暗号に利用する予定なので、x, y, nは正整数限定なんです・・・
>>152
二進展開を厳密に知らないのでなんともいえないのですが、
x, y, nは、unsigned short(16bit)の配列にして扱ってます。
(つまり、65536進数です)これを二進展開というのでしょうか?
0154デフォルトの名無しさん
NGNG二進展開っていうのはこういうやつ。関係ないのかな?
typedef unsigned long int uint32;
uint32 modplus(uint32 a, uint32 b, uint32 m){
return (a > m - b)? a - (m - b): a + b;
}
uint32 modby(uint32 a, uint32 b, uint32 m){
uint32 sum;
for(sum = 0; b > 0; a = modplus(a, a, m), b >>= 1)
if(b & 1) sum = modplus(sum, a, m);
return sum;
}
uint32 modpow(uint32 a, uint32 k, uint32 m){
uint32 b;
for(b = 1; k > 0; a = modby(a, a, m), k >>= 1)
if(k & 1) b = modby(b, a, m);
return b;
}
0156デフォルトの名無しさん
NGNGhttp://www.google.co.jp/search?q=cache:DcfJc-wJCOEC:www.toshiba.co.jp/tech/review/2001/07/56_07pdf/a04.pdf+rns%E8%A1%A8%E7%8F%BE&hl=ja&ie=UTF-8
0157デフォルトの名無しさん
NGNGああ、て事は せいぜい100桁程度? で x,y,nは同じくらいの桁数なんでしょ?
なら FFT使えば多少速くなるかな でも モンゴメリ法とやらはとは関係ないか
0158146
NGNG桁数は大体そのぐらいですね、もう少し多くなりますけど。
モンゴメリが無理そうなら、FFTを試してみます。
(諦める気はありませんが)
皆さん有難うございました、もう少し自分で考えてみます。
0160デフォルトの名無しさん
NGNG「2進より10進パックの方が絶対楽」
0161デフォルトの名無しさん
NGNGそれならまだ100進数の方が楽だと思うけど
0162山崎渉
NGNG0163山崎渉
NGNG( ^^ )< ぬるぽ(^^)
速度・記憶効率のこと考えないならその方がいい。
ま、数式処理とかのコアに使うんでなく、
従来からBCDが使われているように国家予算スケールの加減乗除くらいなら
速さ・記憶領域的にもそれほどは気にならないかも。
0165デフォルトの名無しさん
NGNG0166デフォルトの名無しさん
NGNG終了ぽ?
0167デフォルトの名無しさん
NGNGVC++からも簡易に使えるライブラリは一つくらいあるだろう、と思っていたら
適当なものが無い。
http://www.nitoyon.com/vc/tips/multi_precision.htm
みたいにシンプルな機能が良いけれど、これは実現法が似非で桁精度が出ない。
あとは演算子をオーバーロードせず関数で演算させる古めかしい方法や、やたら
規模が大きくて組込むのに躊躇してしまうものばかり。
英語ソースを探そうと考えているが、多倍長演算を英語では一般に何と言うのだろう?
0168デフォルトの名無しさん
NGNG数百桁の除算やpowmodをやらせようとすると
10進パックで実用的速度を出させるのは大変なこと。
256進数や65536進数など2の羃乗数でやれば
一晩で起こした簡易スクラッチでも
ある程度実用的速度にできるからおすすめ。
0169デフォルトの名無しさん
NGNGmulti precision arithmeticsとかかねぇ。
0170山崎渉
NGNGピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0171デフォルトの名無しさん
NGNGむしろこの過疎スレを応援してくれw。
0172デフォルトの名無しさん
NGNG0173デフォルトの名無しさん
NGNGむしろ100進・万進が実用的だと思うよ。
デバックも楽だし、加算減算ですぐにオーバフローしないから桁上がり処理も楽で速い
0174デフォルトの名無しさん
NGNGhttp://3.141592653589793238462643383279502884197169399375105820974944592.jp/
誰か全部受信して何桁あるか報告きぼん。
0175デフォルトの名無しさん
NGNGadd(30781)
までそらでいえる。
0176デフォルトの名無しさん
NGNG20MB落としてもダウソが終わらないので途中でやめた
0177デフォルトの名無しさん
NGNG要求受けてから計算してたr何処までも逝くかも。
0178デフォルトの名無しさん
NGNGマヂかよ
0179デフォルトの名無しさん
NGNGよく見つけた―ね
0180デフォルトの名無しさん
NGNGDate: Mon, 9 Jun 2003 10:11:47 GMT
Server: Pi-Server/0.1 (Unix)
Connection: close
Content-Type: text/html
だってさ。
0181デフォルトの名無しさん
NGNG前聞いたとき200Mくらいあると聞いた。
0182デフォルトの名無しさん
NGNGGoogleのキャッシュは101302桁でつた。
0183デフォルトの名無しさん
NGNG一桁当たりの桁上がり処理の早い、遅いは機械語レベルでどうなるかってくらいの話だからなぁ。
一桁が2のべき乗ならビット論理演算、
ワード幅一杯まで使うときはCPUのフラグとか見るわけ(高級言語ではムリだが)で…。
これが10進だと引き算(比較演算)とかでやることになるだろう?
ビット演算なら引き算と大差ないし、フラグが見られれば追加の演算無しで直接分岐できる。
ちなみに、一桁にできるだけ大きな数をつめたほうが桁数が減って記憶領域とループの回数は減る。
デバッグは一度やれば終わりだし、整数の加減程度ならそんなに大変って程でもないよ。
(乗除は効率よく計算するのは基数がいくつでもどのみち大変だしw。)
ところで、そういや記憶階層を意識した最適化とかした例はあるのかな?
0184デフォルトの名無しさん
NGNGもちろんcだけでも無理すりゃできるけど、効率が悪いコードになる。
0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNGコードは大変って事はないけど、処理が重くなる。
デバッカでメモリイメージ見た時に簡単にチェック出来ないし
0187デフォルトの名無しさん
NGNGもちろんそれより長いレジスタにキャストしてってのはナシで
一つは計算前と計算後とで比較判断を組み合わせる方法
もう一つは論理演算を組み合わせる方法
0188デフォルトの名無しさん
NGNGまぁ、確かに「C++の機能だけ」という限定下ではそうなんだけどね。
でもその前提を守ることは速度と保守性のトレードオフですなぁ。
最適化が頑張って同等のコードを吐けるように助ける手立てとかは無いもんかね。
>>185-186
用途にも拠るが表示は実行回数が少ないから演算より多少遅くても割とOKなんでは?
デバッガでの表示に関しては多倍長数に限らないような。
>>187
加算はまだしも乗算がかなり悩ましくないですか?
0189デフォルトの名無しさん
NGNG__int64の64bit程度じゃ実用になりませんか?
0190デフォルトの名無しさん
NGNG君の実用的の定義をくれたまえ。
0191デフォルトの名無しさん
NGNG極秘の伝達(今夜飲みにいかない〜?)とかがバレないレベルです。
0192デフォルトの名無しさん
NGNG掛算はCPUの掛算命令使わないとやっぱり速度出ないんだけど、
C++だけでやるなら、やっぱり100進万進の方が楽だな
0193デフォルトの名無しさん
NGNGCPUの乗算命令を使わないとしても
ヒトケタに収容できる数を大きくすると、桁数が減るので
速度効率とメモリ効率の改善に対してリニアに効くんですがね。
桁あふれの判定と10進変換をカプセル化してあれば、
それ以外の計算アルゴリズム自身は何進だろうが大して変わらないし。
100万進で楽できることってデバッグくらいでしょ。
それで楽できる分は大したことはないと思うから私はやらないだろうと思うけど。
ま、どうしても未練があるなら100万進で書き上げて
デバッグがあらかた終わったらヒトケタのサイズを変更すると言う手もないことはない。
0194デフォルトの名無しさん
NGNG16bitで 10000進数でも同じだけど 8bit マシンで 100進法と
バイナリの比較を考えると メモリ効率については log(100)/log(2) : 8 = で17%悪化する。
17%の差を大きいかどうかだけど、そんなに必死になる程のレベルじゃない。
掛算の場合、フルビットを使ってしまうと桁上がりをその都度やらなければいけなくなる
FF*FF=FE01 でFE01 でこれを中間レジスタに足すとまた上の桁にキャリーが上がってゆく可能性があり
ループが複雑になる。
99*99=9801 ならば 桁上がりがあっても、とりあえず加算したままにしておいて、1ループ終わってから処理出来る
もちろんここらへんアセンブラで書けばそれでもフルビットを使った方に軍配が上がるけど
普通にCで書くと、たぶん速度的には100進や万進の方が早くなったように思う。
まあ、中にはそれでもCレベルでもフルビット使った方が早く書ける奴もいるかもしれないが
0195デフォルトの名無しさん
NGNGなんで今時わざわざ8ビット話かわからんが…。
まぁ17%が許容できるかどうかは>>1の「C++/Cだけで」という前提が
どういう理由で出てきたかに拠るんだけどね。
それがハッキリすればマシン・コードをどの程度避けねばならないかもハッキリするわけで。
極端な話、学校の宿題レベルなら頑張ってチューニングするより
手っ取り早く動くものが出来上がるほうがいいわけだしね。
0196デフォルトの名無しさん
NGNGa[n] × b[m ] -> w[n+m]
for(int mm = 0 ; mm < m ; mm++) {
for(int nn = 0 ; nn < n; nn++){
// ここを埋めてみて
}
// ここも必要なら
}
0197デフォルトの名無しさん
NGNG0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNGまず餅つけ。で、順番にナニがいいたいのか整理してみれ。
0200デフォルトの名無しさん
NGNG0201山崎 渉
NGNG__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0202山崎 渉
NGNG__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0203デフォルトの名無しさん
NGNGもちついた?
続きキボンにゅ。
山崎に保守されてるようなこの状況はなぁw。
0204デフォルトの名無しさん
NGNG0205山崎 渉
NGNG0206山崎 渉
NGNG│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0207デフォルトの名無しさん
NGNG乗算をFFTでやって、テンプレート・メタ・プログラミングで記憶階層毎の最適化対応の奴。
一応、プロファイル・ベースで自動チューニングまで考えているんだが…。
…だが単なるFFTのプログラミングとデバッグで1週間も掛かった…このペースではダメぽ。
0208デフォルトの名無しさん
NGNG0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG02121
NGNG02131
NGNG0214デフォルトの名無しさん
NGNGなんで正式版に入らないのかはわからないが
0215デフォルトの名無しさん
NGNG0216お仕事探していまつ(207) ◆y3A2MadQ16
NGNG実は前段階のFFTについて、
テンプレート・メタ・プログラミングで記憶階層毎の最適化対応の奴。
一応、プロファイル・ベースで自動チューニング…
…ってのがやっと一通り動いたので先日青森で開かれた研究集会まで行って発表してきた。
多倍長整数の乗算はまだ遠い…。
02171
NGNG02181
NGNG0219デフォルトの名無しさん
NGNGでもやりたいんです!!僕はHSPでブロック崩し(アルカノイド)
ぐらいなら作ったことあります。
今のところ、オープニングまで作ったのですが、どなたか僕に
HSPの基礎からすべてを叩き込んでくれませんか??
お願いします。
0220デフォルトの名無しさん
NGNGでもやりたいんです!!僕はHSPでブロック崩し(アルカノイド)
ぐらいなら作ったことあります。
今のところ、オープニングまで作ったのですが、どなたか僕に
HSPの基礎からすべてを叩き込んでくれませんか??
お願いします。
02211
NGNG0222デフォルトの名無しさん
05/02/05 10:23:000223デフォルトの名無しさん
2005/05/12(木) 10:09:51char mozi[]="unko"; この文字列は16進数値で「756E6B6F」
ですけどこの数値を2バイトごとの合計値として求める場合
「756E + 6B6F」が適切なのか、それともバイト反転した「6E75 + 6F6B」
が適切なのかわからないので教えてくださいお願いします
0224223
2005/05/12(木) 12:52:520225デフォルトの名無しさん
2005/05/13(金) 09:28:430226配列だけ
2005/05/15(日) 13:10:58できたよ
#include <stdio.h>
#include <string.h>
#define MAX 20
int main()
{
int i;
char result[MAX + 1];
char *a = "1000000000910";
char *b = "1000000000193";
for (i = 0; i < MAX + 1; i++) result[i] = 0;
for (i = 0; i < strlen(a); i++) result[MAX - strlen(a) + i] += a[i] - '0';
for (i = 0; i < strlen(b); i++) result[MAX - strlen(b) + i] += b[i] - '0';
for (i = MAX - 1; i >= 0; i--)
{
if (result[i] >= 10)
{
result[i - 1] += 1;
result[i] -= 10;
}
result[i] += '0';
}
printf("%s(a)+%s(b): %s\n", a, b, result);
return 0;
}
0227デフォルトの名無しさん
2005/05/15(日) 13:11:520228デフォルトの名無しさん
2005/05/15(日) 13:17:32#include <stdio.h>
#define MAX 20
int main()
{
int i;
char result[MAX + 1];
char a[] = "1000000000910";
char b[] = "41000000000193";
for (i = 0; i < MAX + 1; i++) result[i] = 0;
for (i = 0; i < (sizeof(a) - 1); i++) result[MAX - (sizeof(a) - 1) + i] += a[i] - '0';
for (i = 0; i < (sizeof(b) - 1); i++) result[MAX - (sizeof(b) - 1) + i] += b[i] - '0';
for (i = MAX - 1; i >= 0; i--)
{
if (result[i] >= 10)
{
result[i - 1] += 1;
result[i] -= 10;
}
result[i] += '0';
}
printf("%s(a) + %s(b): %s\n", a, b, result);
return 0;
}
0229デフォルトの名無しさん
2005/05/15(日) 15:28:17~~~~~~~~~~~~~~~~
>>226 名前:配列だけ[sage] 投稿日:2005/05/15(日) 13:10:58
~~~~~~~~~~~~~~~~~~~~~~~~
( ゚д゚)
(つд⊂)ゴシゴシ
(;゚д゚)
(つд⊂)ゴシゴシ
_, ._
(;゚ Д゚)
0230デフォルトの名無しさん
2005/05/15(日) 20:10:4502311
2005/05/16(月) 02:16:3302321
2005/05/16(月) 02:17:01「あれからもう2年半も経つとは…長いなぁ」
0233デフォルトの名無しさん
2005/05/16(月) 13:35:280234216
2005/10/28(金) 01:15:42仕事は多倍長からはかなり離れてしまったけれどね。
しかしこのスレまだあったんだねぇ。人少ないけど長寿だねぇ。
たまにはage保守しときまつか。
0235デフォルトの名無しさん
2005/10/28(金) 10:48:250236デフォルトの名無しさん
2005/10/28(金) 11:46:1502371
2005/10/28(金) 15:22:59新着チェックで上がってこなかったら気付かなかった。
■ このスレッドは過去ログ倉庫に格納されています