hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 767|回复: 9

B计划之大数乘以10,除以10的快速算法的讨论和实现

[复制链接]

557

主题

557

帖子

1898

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1898
发表于 2023-10-2 16:15:38 | 显示全部楼层 |阅读模式
显然,对大整数乘以10或者除以10的高速实现,是以移位为基础实现的
希望有兴趣的能写出测试代码,以得到最优化的实现,老规矩32Bit x86平台,C/C++或者汇编,汇编指令到SSE2

乘以10的好处理,假设大数为n,长度为k
方案1  10n = (n << 2 + n) << 1
运算次数 3k,额外存储 1k
方案2  10n = n << 3 + n << 1
运算次数 3k,额外存储 2k
所以个人倾向于使用方案1
运算时间为O(k)

除以10是以一系列的右移位为基础的,算法稍后送上
运算时间是O(klogk)
回复

使用道具 举报

0

主题

201

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:16:33 | 显示全部楼层
$1 / 10 =\sum_{n=1}^{infty}1/2^{4n}+1/2^{4n+1}$

所以针对除以10的算法,稍微要复杂些,个人建议是最好用c/c++写主函数,而调用汇编过程
回复

使用道具 举报

0

主题

202

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:16:46 | 显示全部楼层
固定除数的除法,有可以通过三次乘法替代的快速算法的。
回复

使用道具 举报

0

主题

192

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:17:30 | 显示全部楼层


你能找到么?

另外三次乘法也不一定能快过移位
移位速度大概仅次于内存拷贝速度
至少是乘法速度的3-4倍甚至还多

所以如何选择我们需要测试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

171

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-10-2 16:17:42 | 显示全部楼层
之前说错了,如果仅需得到商,应是需一次乘法、一次移位运算。

Unsigned division by constant
=============================

enter divisor: 10

; dividend: register other than EAX or memory location

MOV EAX, 0xCCCCCCCD
MUL dividend
SHR EDX, 3

; quotient now in EDX

而楼主的要求,显然需要同时获得余数,则需再增加一次乘法、一次减法运算,
下面是我写的代码,请检验:

// 返回余数;u32Num 作为输入的被除数,同时作为输出的商
__declspec(naked)
CONST UINT32 DivMod10( UINT32& u32Num )
{
        __asm
        {
                mov                ecx, dword ptr[esp + 0x04];

                mov                edx, dword ptr[ecx];
                mov                eax, 0xCCCCCCCD;        // [ 2^35 / 10 + 0.5 ]
                push        edx;

                mul                edx;
                shr                edx, 3;
                mov                dword ptr[ecx], edx;

                imul        edx, 10;

                pop                eax;
                sub                eax, edx;

                ret;
        }
}

附件是无符号固定除数的快速算法,输入除数,自动输出汇编指令(含源代码)。
回复

使用道具 举报

0

主题

172

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:17:52 | 显示全部楼层
长整数阿

老大
回复

使用道具 举报

0

主题

212

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-2 16:18:25 | 显示全部楼层
我知道你说的是大整数算法,但除数是个常规整数,
用普通的算法可以减少数据的读写次数,效率不会慢的。
回复

使用道具 举报

0

主题

173

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2023-10-2 16:18:55 | 显示全部楼层
那你的算法还有效果么
回复

使用道具 举报

0

主题

189

帖子

25

积分

新手上路

Rank: 1

积分
25
发表于 2023-10-2 16:19:28 | 显示全部楼层
我没有针对除10作特殊优化。

且我给的算法仅适用于基数是10的整数次幂的情形。
这是刚刚注意到的,难怪你在6#曾强调“长整数”,
因为我看到10,脑子里就默认用10的整数次幂做基数了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

182

帖子

63

积分

关内侯

Rank: 2

积分
63
发表于 2023-10-2 16:19:57 | 显示全部楼层


我想比如这么个题目

a = 2^1023 - 1
b = 10
c = a / b
仅针对b = 10优化
不考虑a = 2^1023 - 1的特殊性

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 20:52 , Processed in 0.075472 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表