找到中央二项式系数2n的优化程序选择n模(2n + 1)

时间:2018-07-20 23:42:26

标签: optimization mod binomial-coefficients

我试图找到满足两个条件的正整数n:

  1. 2n + 1不是素数。
  2. 2n选择n等于(-1)^ n模(2n + 1)

我检查了多达950000,只发现n = 2953。但是,此后它变得非常慢,因为我正在使用GMP计算二项式系数2n选择n,现在它的长度为几十万位数。由于我只对余数为2n + 1的二项式系数感兴趣,因此我觉得应该有一种更有效的方法,而不必实际计算二项式系数。我考虑过在每次乘法后取余数模2n + 1来防止数字变大,但是我不确定要怎么做,因为我需要计算n!的模乘逆,但是2n + 1不是素数,因此该逆数将不存在,并且我不确定如何表示2n时,通常选择n作为整数的乘积。任何想法,将不胜感激。我可能缺少一些非常简单的东西。

我的代码如下:

#include <iostream>
#include <gmp.h>

using namespace std;

int main()
{
  unsigned long long int n;
  int isprime=1;
  mpz_t a; // GMP long integer
  mpz_init(a); 
  for (n=1;n<=1000000;n++) {
    for (int i=2;i*i<=n;i++) { // testing if n is prime
    if ((2*n+1) % i == 0) {
      isprime=0;
      break;
    }
    }
    if (isprime == 0) { 
      mpz_bin_uiui(a,2*n,n); // Setting a equal to the binomial coefficient 2n choose n
      if (n % 2 == 0) { 
    mpz_sub_ui(a,a,1); // a-- if n is even
      }
      else {
    mpz_add_ui(a,a,1); // a++ if n is odd
      }
      mpz_cdiv_r_ui(a,a,2*n+1); // a = a % (2*n+1)
      if (mpz_cmp_ui(a,0)==0) {
    cout << n << endl;
      }
    }
    isprime=1;
  }
}

0 个答案:

没有答案