我试图找到满足两个条件的正整数n:
我检查了多达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;
}
}