有没有人知道更好的模数位?

时间:2016-08-30 09:52:21

标签: c math biginteger modulo

我有2个大数字,一个大约4096位,另外2048位,存储在一个结构中:

 typedef uint32_t word;
 typedef struct BigNumber {
     word words[128];
 } BigNumber;

我必须制作那些模数,并且我能想到的唯一方法是多次减去,但这需要一些时间。

有人知道更好的方法吗?

3 个答案:

答案 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和余数(模数),但我现在不记得它的名字。