无心人
发表于 2008-10-17 13:23:56
如果程序没有错误,我想我以移位代替除法的设想就是不好实现的了
无心人
发表于 2008-10-17 16:01:52
:)
中午糊涂了
并不需要计算到多少位的
比如10000
只要计算到1/2^64以上
每次只考虑64位的数字就可以了
同样的任何10^k都可以计算出一个移位序列
且找到一个较合适的二进制块长度
这个块长度最好是64的倍数
无心人
发表于 2008-10-17 16:03:56
如果按64位计算
则1/10000取14 15 17 21 22 24 25 27 28 29 33 35 36 37 39 41 42 46 47 48 52 57 58 61 63
就可以了,共25个项,处理好的话,可以在64步骤内完成
gxqcn
发表于 2008-10-17 19:35:38
不好意思,后面几帖读了几遍,但仍不明就里。:L
无心人
发表于 2008-10-17 19:38:17
:lol
就当作我自言自语吧
我想我说的有点无法实现了
所以可能要回归你们算法的思想
gxqcn
发表于 2008-10-17 19:43:08
我的意思是没看能懂你的程序,也不明白你这么做的出发点和目的,无限困惑中。。。
无心人
发表于 2008-10-17 19:49:26
:)
我不是说想用移位代替除法么?
我那里是能得到一个2^32内整数的倒数
的二进制表示啊
输出的是二进制小数的位是1的
以小数点右边第一位索引是1
的位的索引
原理是十进制小数转二进制
只要不断乘以2
有进位到个位
表示当前bit是1
否则是0
可以得到无限精度的数字
gxqcn
发表于 2008-10-17 19:55:17
似乎不划算,效率可能成问题。
无心人
发表于 2008-10-17 19:58:31
你的意思是这么做进制转换不划算
还是这么做除法不划算
另外,移位的速度要远远大于加法
这么说吧
数据在内存的复制操作如果时间是1
则移位就应该是1.5
加法则在4以上
乘法在36以上了
G-Spider
发表于 2013-6-2 21:55:53
快速求大整数关于 2^n 的模逆
应该可以用到这里来,这个大整数可以限定在1~2^32-1的奇数。(偶数移位一下)
例如:
3x≡1 (mod 2^32)
得到2863311531
有120/3转化为120*2863311531 (mod 2^32)=40
gmp倒是这么用的,比较好奇,如何快速得到这个逆元。