[問題] 超級大數運算問題

看板C_and_CPP (C/C++)作者 (AmazingTWman)時間13年前 (2013/01/12 23:30), 編輯推噓2(2013)
留言15則, 3人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC 問題(Question): 我正在寫一個跟密碼學有關的程式Elliptic Curve 超過20位數的運算 我用unsigned long long int都不行 不知道該怎麼辦O_Q y^2 = x^3 +3x +12 Zp=2147483629 x=401613751 內建函式pow沒辦法算那麼大的數 所以我用x*x*x硬算-.- 但是x^3是64777729713265913381403751 @@" 因為如果存不到變數裡連mod都沒有辦法 不知道該怎麼繼續下去... 有一個Hint是 The “double and add” strategy helps you come out a linear time implementation of scalar multiplication instead of exponential time 但是我看不懂這是要幹嘛= = 把變數宣告改成double連算都沒法算 然後沒有在C++裡面看過add 所以不知道是幹嘛的@@ 這種20位數以上的運算有辦法算嗎@@? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.169.162.109

01/12 23:32, , 1F
google 「大數演算法」, 高效 library : GMP
01/12 23:32, 1F

01/12 23:32, , 2F
(a*b)%c = ((a%c)*(b%c))%c
01/12 23:32, 2F

01/12 23:32, , 3F
多個數字時類推
01/12 23:32, 3F

01/12 23:33, , 4F
你的 Zp 平方是還在 unsigned long long int 範圍內的
01/12 23:33, 4F

01/12 23:33, , 5F
同suhorng大大
01/12 23:33, 5F

01/12 23:33, , 6F
疑!不過你的問題未必要用大數耶,要用 mod 的全式寫出來 ?
01/12 23:33, 6F

01/12 23:33, , 7F
Hint在講計算 a^b % c 時, 的 O(log b) 算法, 不用 O(b)
01/12 23:33, 7F

01/12 23:33, , 8F
@@ 慢了
01/12 23:33, 8F

01/12 23:34, , 9F
他提到的就是反覆平方法 (有人叫他 bigmod...XD)
01/12 23:34, 9F

01/12 23:36, , 10F
嗯,謝謝 shuorng 補充. @原 po: google 蒙格馬利快速取模
01/12 23:36, 10F
我用(((x*x)%p)*x)%p 算出來的結果是1424112743 自己用小算盤算64777729713265913381403751 % 2147483629 = 220886070 為什麼不一樣@@? 我哪裡錯了嗎@@? 還是真的要去用array的方式寫個大數運算啊@@?

01/13 00:12, , 11F
( (x%p) * (x%p) *(x%p) ) % p;
01/13 00:12, 11F

01/13 00:13, , 12F
然後你的 p 如果超過 sqrt(max_unsigned long long) 會 ov
01/13 00:13, 12F
剛剛發現原來我宣告沒弄好所以ov了-.- 感謝<(_ _)>

01/13 00:19, , 13F
更正, ( ( (x%p) * (x%p) ) %p) * (x%p) ) %p
01/13 00:19, 13F

01/13 00:20, , 14F
還是用 loop 去搞吧 @@
01/13 00:20, 14F

01/13 00:21, , 15F
假設 x%p = a , 如果 p > sqrt(ULL), 那 a * (a%p) 也 ov
01/13 00:21, 15F
input不會超過2^31 所已經該不會ov o.o ※ 編輯: initial1635 來自: 1.169.162.109 (01/13 00:24)
文章代碼(AID): #1GyO6Vi8 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GyO6Vi8 (C_and_CPP)