c 代码:防止模块操作中的超大模块溢出靠近溢出阈值的模块

问题描述

在我的 c 代码中,我必须执行一系列递归模块化操作。特别是我必须执行像 (A*B)modC 这样的操作,C~2^126 和 A,B,原则上,可能是非常大的数字(从 0 到 2^128 - 1)(我与128 位 unsigned __int128 变量)。
问题是如何在乘法过程中执行模块。我需要这个,因为如果在乘法之后执行模块,我可能会在乘法期间超过 2^128(如果 A 和 B 非常大)并破坏连续的模运算。
所以我想执行一个乘法,每次我通过 C(在乘法过程中)而不是每次我通过 2^128 - 1 时都从 0 重新开始。
我该怎么做?

解决方法

最简单的解决方案是将乘法实现为位循环,每次移位一并添加。通过这种方式,您可以计算每次通过循环的中间结果的模数。

它需要 128 次移位、128 次加法和 128 次模运算。如果这对你来说太慢了,那么一些专家可能会告诉你一个优化(但每个人都知道你应该只在你确定最简单的解决方案不够快时才考虑优化)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...