计算二进制的二项式系数
Calculate binomial coefficient in binary
有没有一种计算二项式系数并将结果保留为二进制的快速算法。例如,(10 选择 8) = 101101。我不需要将我的结果转换为以 10 为基数,而是我想将我的结果存储为二进制字符串。我在重新发明轮子之前问过这个问题。
我找到了最有效的方法。它正在执行二项式系数的质因数分解,然后转换为二进制。我添加了非常快速的代码来查找二项式系数的质因数分解。如果您喜欢那种东西,它被称为 Kummer's theorem and you can use this online calculator to verify your results. The factorization algorithm is from this Jstor paper. This is a Haskell 版本。请注意,您需要先自己生成一个素数列表。然后测试单个素数。还有算术基本定理在起作用
//Note primeNumber is always less than n
//Inputs n,k,primeNumber
//Output: e (the exponent of prime number)
//Note: 0 means primeNumber is not a factor of this binomial coefficient
//Example: (n=10,k=3,primeNumber=3), e = 1
//So if you had a list of primes 2,3,5 then for each you get e=3,e=1,e=1. (10,3) = 2^3 *3^1 * 5 ^1
int BinomialFactorization(int n, int k, int primeNumber)
{
int a = 0;
int b = 0;
int exponent = 0;
int r = 0;
//Finds smaller value between n and n-k since (n choose k) == (n choose n-k)
//Algorithm only works when k < n/2
if(k > (n/2))
{
k = n - k;
}
//Speeds up according to paper
if(primeNumber > n - k)
{
return 1;
}
//Speeds up according to paper
if(primeNumber > n/2)
{
printf("%d", 0);
return 0;
}
if(primeNumber * primeNumber > n)
{
if(n % primeNumber < k % primeNumber)
{
return 1;
}
else
{ //Saw this on online calculator
return 0;
}
}
//Changing base algorithm
while(n > 0)
{
a = n % primeNumber;
n = n / primeNumber;
b = k % primeNumber + r;
k = k / primeNumber;
if(a < b)
{
exponent = exponent + 1;
r = 1;
}
else
{
r = 0;
}
}
return exponent;
}
有没有一种计算二项式系数并将结果保留为二进制的快速算法。例如,(10 选择 8) = 101101。我不需要将我的结果转换为以 10 为基数,而是我想将我的结果存储为二进制字符串。我在重新发明轮子之前问过这个问题。
我找到了最有效的方法。它正在执行二项式系数的质因数分解,然后转换为二进制。我添加了非常快速的代码来查找二项式系数的质因数分解。如果您喜欢那种东西,它被称为 Kummer's theorem and you can use this online calculator to verify your results. The factorization algorithm is from this Jstor paper. This is a Haskell 版本。请注意,您需要先自己生成一个素数列表。然后测试单个素数。还有算术基本定理在起作用
//Note primeNumber is always less than n
//Inputs n,k,primeNumber
//Output: e (the exponent of prime number)
//Note: 0 means primeNumber is not a factor of this binomial coefficient
//Example: (n=10,k=3,primeNumber=3), e = 1
//So if you had a list of primes 2,3,5 then for each you get e=3,e=1,e=1. (10,3) = 2^3 *3^1 * 5 ^1
int BinomialFactorization(int n, int k, int primeNumber)
{
int a = 0;
int b = 0;
int exponent = 0;
int r = 0;
//Finds smaller value between n and n-k since (n choose k) == (n choose n-k)
//Algorithm only works when k < n/2
if(k > (n/2))
{
k = n - k;
}
//Speeds up according to paper
if(primeNumber > n - k)
{
return 1;
}
//Speeds up according to paper
if(primeNumber > n/2)
{
printf("%d", 0);
return 0;
}
if(primeNumber * primeNumber > n)
{
if(n % primeNumber < k % primeNumber)
{
return 1;
}
else
{ //Saw this on online calculator
return 0;
}
}
//Changing base algorithm
while(n > 0)
{
a = n % primeNumber;
n = n / primeNumber;
b = k % primeNumber + r;
k = k / primeNumber;
if(a < b)
{
exponent = exponent + 1;
r = 1;
}
else
{
r = 0;
}
}
return exponent;
}