如何找到大数模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"代替
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- c++r值引用应用于函数指针
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 有没有任务栏API可以立即应用注册表更改
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何找到大数模100000007的多重应用