Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 除数算法_C++_Algorithm_Primes_Factorization - Fatal编程技术网

C++ 除数算法

C++ 除数算法,c++,algorithm,primes,factorization,C++,Algorithm,Primes,Factorization,我得到一个整数列表(最多1000个),这些整数与给定的整数相乘n 我需要在整数的所有除数中找到最高的幂n 例如:4,7,8乘以224,由于224=2^2*7*2^3=2^5*7,因此最高幂为5 问题是,1000个整数可以大到2^64,因此n非常大 解决这个问题的好算法是什么 困难。我首先检查小素数(在你的例子中:4,7,8。乘积有一个因子2^5。你除以2的幂,剩下1,7,1。然后你对3,5,7等做同样的操作,直到X) 现在你需要找到一个更大的素数p>X,它的幂比你找到的最高值要高。花大量时间寻找

我得到一个整数列表(最多1000个),这些整数与给定的整数相乘
n

我需要在整数的所有除数中找到最高的幂
n

例如:4,7,8乘以224,由于224=2^2*7*2^3=2^5*7,因此最高幂为5

问题是,1000个整数可以大到2^64,因此
n
非常大


解决这个问题的好算法是什么

困难。我首先检查小素数(在你的例子中:4,7,8。乘积有一个因子2^5。你除以2的幂,剩下1,7,1。然后你对3,5,7等做同样的操作,直到X)

现在你需要找到一个更大的素数p>X,它的幂比你找到的最高值要高。花大量时间寻找只发生一次的主要因素似乎是浪费。你需要的素数是多个数的因子。计算每对数字的gcd,并查看这些数字的素数因子。有很多细节需要解决,这就是为什么我从“困难”开始

最坏的情况是,你不容易找到任何出现两次的素数,所以你需要检查每一个数字是否包含素数的平方作为因子

举个例子:你检查了高达1000的因子,发现素数的最高幂是83^3。所以现在你需要找到一个更大的素数,它是四次方,或者证明没有。计算成对的gcd(最大公约数)。一个大素数可以是来自四个不同数字的gcd的倍数的除数,或者p可以是三个gcd的因子,p^2是一个数字的因子等等

要澄清这个原理:假设你有两个巨大的数字x和y,你想知道哪个是一个素数的最高幂,它将xy分为。你可以考虑x和y,然后从那里开始。如果它们都是素数或两个大素数的乘积,比如x=p或pq,y=r或rs,这需要很长时间


现在计算x和y的gcd。如果最大公约数z>1,那么z是x和y的因子,因此z^2是xy的因子。如果最大公约数是1,那么x和y没有公因子。因为我们不需要非正方形的因子,所以我们寻找正方形和更高的因子。为此,只需除以x^(1/3)或y^(1/3)以下的因子即可

困难。我首先检查小素数(在你的例子中:4,7,8。乘积有一个因子2^5。你除以2的幂,剩下1,7,1。然后你对3,5,7等做同样的操作,直到X)

现在你需要找到一个更大的素数p>X,它的幂比你找到的最高值要高。花大量时间寻找只发生一次的主要因素似乎是浪费。你需要的素数是多个数的因子。计算每对数字的gcd,并查看这些数字的素数因子。有很多细节需要解决,这就是为什么我从“困难”开始

最坏的情况是,你不容易找到任何出现两次的素数,所以你需要检查每一个数字是否包含素数的平方作为因子

举个例子:你检查了高达1000的因子,发现素数的最高幂是83^3。所以现在你需要找到一个更大的素数,它是四次方,或者证明没有。计算成对的gcd(最大公约数)。一个大素数可以是来自四个不同数字的gcd的倍数的除数,或者p可以是三个gcd的因子,p^2是一个数字的因子等等

为了阐明原理:假设你有两个巨大的数字x和y,你想知道除以xy的素数的最高幂。你可以考虑x和y,然后从那里开始。如果它们都是素数或两个大素数的乘积,比如x=p或pq,y=r或rs,这需要很长时间


现在计算x和y的gcd。如果最大公约数z>1,那么z是x和y的因子,因此z^2是xy的因子。如果最大公约数是1,那么x和y没有公因子。因为我们不需要非正方形的因子,所以我们寻找正方形和更高的因子。为此,只需除以x^(1/3)或y^(1/3)以下的因子即可

这是一个骗人的问题。每个整数(包括整数本身,如果它们是素数)的最大素数因子将始终与其乘积的最大素数因子相同。基础数学。事实上,我不是在寻找最大素数,而是所有素数的最大幂,也就是最高的k,使得d^k除以n得到所有的d。它是max{k,因此d^k|n,其中d是n}的除数并不重要。计算完每个数字的素数后,只需将它们相加。例如,以4、7和8为例,得到2*2、7、2*2*2。你有五个2,这是你的答案。您不需要将它们相乘,只需将每个整数单独乘以因子,然后将它们相加即可。基础数学。那么这只是一个关于求一个数的素数的最有效方法的问题。我敢肯定,在这个话题上,之前有很多问题,在这里的某个地方。。。在谷歌上搜索“埃拉托西内斯的筛子”。@SamVarshavchik:筛子对于查找一个大数字的因子,或者查找1000个数字到2^64的因子是毫无用处的。这是一个技巧性的问题。每个整数(包括整数本身,如果它们是素数)的最大素数因子将始终与其乘积的最大素数因子相同。基础数学。事实上,我不是在寻找最大素数,而是所有素数的最大幂,也就是最高的k,使得d^k除以n得到所有的d。它是max{k,因此d^k|n,其中d是n}的除数并不重要。计算完每个数字的素数后,只需将它们相加。例如,以4、7和8为例,得到2*2、7、2*2*2。你有五个2,那是你的