c++ - 有没有优化两个 BigNum 相乘的好方法?
问题描述
我有一堂课BigNum
:
struct BigNum{
vector <int> digits;
BigNum(vector <int> data){
for(int item : data){d.push_back(item);}
}
int get_digit(size_t index){
return (index >= d.size() ? 0 : d[index]);
}
};
我正在尝试编写代码来乘以两个BigNum
s。目前,我一直在使用传统的乘法方法,将第一个数字乘以另一个数字的每个数字,然后将其添加到运行总数中。这是我的代码:
BigNum add(BigNum a, BigNum b){ // traditional adding: goes digit by digit and keeps a "carry" variable
vector <int> ret;
int carry = 0;
for(size_t i = 0; i < max(a.digits.size(), b.digits.size()); ++i){
int curr = a.get_digit(i) + b.get_digit(i) + carry;
ret.push_back(curr%10);
carry = curr/10;
}
// leftover from carrying values
while(carry != 0){
ret.push_back(carry%10);
carry /= 10;
}
return BigNum(ret);
}
BigNum mult(BigNum a, BigNum b){
BigNum ret({0});
for(size_t i = 0; i < a.d.size(); ++i){
vector <int> row(i, 0); // account for the zeroes at the end of each row
int carry = 0;
for(size_t j = 0; j < b.d.size(); ++j){
int curr = a.d[i] * b.d[j] + carry;
row.push_back(curr%10);
carry = curr/10;
}
while(carry != 0){ // leftover from carrying
row.push_back(carry%10);
carry /= 10;
}
ret = add(ret, BigNum(row)); // add the current row to our running sum
}
return ret;
}
这段代码仍然运行得很慢;计算 1000 的阶乘大约需要一分钟。有没有更好的方法将两个 BigNum 相乘?如果没有,是否有更好的方法来表示可以加速此代码的大量数字?
解决方案
如果您使用不同的基数,例如 2^16 而不是 10,则乘法会快得多。
但是以十进制打印会更长。
推荐阅读
- php - 如何获得视频的最高比特率和尺寸?
- shell - 将 SQL 选择语句的输出获取到 Shell 脚本的新行中
- c - 输入只能输入数字,我怎样才能让它也输入字符串?
- java - 使用 Spring Rest Template 时如何写出不可转换的消息体
- python - 我们可以让这更快吗?Moschopoulos 算法
- weka - 将数组输入到 Weka
- java - java.lang.RuntimeException:不支持的文字类型类 org.apache.spark.sql.Dataset /Spark - JAVA
- java - 使用 Spring 和 Jooq 启动 Java 应用程序时出现 PostgresSQL 驱动程序异常
- visual-studio - XAML-Designer 中的 Visual Studio“自动”宽度/高度
- docker - 无法登录 Docker 将图像推送到 Github