簡體   English   中英

如何找到以100000007為模的大數乘法

[英]how to find muliplication of large numbers modulo 100000007

我們知道1000000007是一個大質數。 如何找到兩個大數的模1000000007的乘法

例如,如果我想找到78627765 * 67527574 mod 1000000007,該怎么辦。

至少有人告訴我我會嘗試的程序

注意:請讓我知道具有int,long或long long等原始數據類型的解決方案,謝謝

模鏈具有合理的數量,這些數量正在推高數字比較空間的極限:

(A * B) % C == ((A % C) * (B % C)) % C.

證明很簡單,全世界加密網站上確實有成千上萬個示例。 一個簡單的示例:

(7 * 8)%5 = 56%5 = 1

((7 % 5) * (8 % 5)) % 5 = (2 * 3) % 5 = 6 % 5 = 1

我希望這有幫助。 顯然,當A和B已經達到您的高端平台限制,並且仍然小於C時,它就變得毫無意義,但是當情況並非如此時(例如,A> C和/或B> C )。

由於這看起來像是作業或上下文問題,因此我僅給出提示。

如果您知道x%m和y%m,如何找到(x + y)%m? 如果您知道x%m,怎么找到(2x)%m?

由於您想找到(a * b)%m,有沒有一種方法可以分解b,以便可以使用上面的兩個提示?

您為什么不想為此使用64位算術? 當然,這僅在被乘法的操作數每個不超過32位的情況下才有效(但這也可以是固定的)。 考慮:

typedef unsigned long long uint64;
uint64 m = 1000000007UL;
uint64 r = (uint64)a * (uint64)b;
r = r % m; // get the residue

您還可以對其進行優化,以避免可能昂貴的'%':

double inv = 1.0 / 1000000007UL; // precompute inverse
uint64 r = (uint64)a * (uint64)b;
uint64 rf = (uint64)floor((double)a * (double)b * inv); // floor(a * b / m) 
r = r - rf * m; //  residue

請注意,第二種方法可能需要一定的准確性。 您也可以使用“ long double”代替

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM