我正在为数论中的一个研究项目编写一些C代码,它需要用许多不同的模块用模块化算法进行大量操作。简单地说:我需要多次执行(a * b) % n操作。我的问题是:使用Montgomery模乘(只使用加法和乘法)而不是C模运算符% (它翻译成a % n = a - n*(a / n)并使用除法)会带来更快的执行速度吗?直觉上,我想说答案是:不,因为在个人电脑上的(字大小)除法比(字大小的)乘法要昂贵得多,而蒙哥马利的减少实际上会造成开销。
谢谢你的建议。更新:一方面,根据保罗·奥格尔维(见下面的评论),
来自this question, it seems Google Chrome and Node.js both chose to implement arbitrary precision arithmetic如果我们可以进行加法、减法、乘法或除法,并且7+8= 15并进位到下一位,则比逐位运算更快,7+8需要将两位相加4次。
我在做考试练习,其中一个问题要求你创建一个叫做除法(a,b)的函数,计算这两个参数的商数和剩余部分,并返回两个结果。您不能使用内置的除法运算符或模运算符,而必须使用循环进行此操作,循环反复调用减法函数(在活动的前一步中生成的函数)。我基本上已经知道了如何确定商和余数,但我不知道如何在循环中用减法进行除法。1) rem = subtract(a,sub)
众所周知,整数除法是慢运算(通常比整数乘法慢几倍)。但是,如果需要使用固定除数执行许多除数运算,则可以对除数进行一些预处理,并将"/“替换为乘法和位运算(中的第10章)。正如我所测试的,如果除数是编译时间常量,那么(例如,static final long DIVISOR = 12345L;) JVM将完成这个任务,并用乘法和位操作代替DIVISOR的所有除法。denominator){
for(int i = 0; i < data.length; +