我有2个大数字,一个大约4096位,另外2048位,存储在一个结构中:
typedef uint32_t word;
typedef struct BigNumber {
word words[128];
} BigNumber;
我必须制作那些模数,并且我能想到的唯一方法是多次减去,但这需要一些时间。
有人知道更好的方法吗?
答案 0 :(得分:2)
计算m%n:
modulus(m, n) {
if (m < n) return m
elif (m < (n<<1)) return m - n
else return modulus((modulus(m>>1, n)<<1 + m&1), n)
}
答案 1 :(得分:2)
基于@caf的代码和我的更正。保留OP以编写4个辅助函数。
void BigNumber_Shift_Right(BigNumber *x);
void BigNumber_Shift_Left(BigNumber *x);
int BigNumber_Compare(const BigNumber *a, const BigNumber *b);
void BigNumber_SubtractEqual(BigNumber *a, const BigNumber *b);
void BigNumber_ModHalfSizeEqual(BigNumber *A, const BigNumber *B) {
BigNumber X = *B;
BigNumber AHalf = *A;
BigNumber_Shift_Right(&AHalf);
while (BigNumber_Compare(&X, &AHalf) <= 0) {
BigNumber_Shift_Left(&X);
}
while (BigNumber_Compare(A, B) >= 0) {
if (BigNumber_Compare(A, &X) >= 0) {
BigNumber_SubtractEqual(A, &X);
}
BigNumber_Shift_Right(&X);
}
// mod is in A
}
答案 2 :(得分:0)
您可以将a除以b并得到整数x。现在从a中减去x,得到模数。有了任意的除数,你就无法绕过师。对于大除数,这可能比多次减法更快,但划分仍然很昂贵。
您可能还必须手动为这么大的数字实现divison算法。那里有一个,它同时产生qoutient和余数(模数),但我现在不记得它的名字。