生成给定素数因子分解的数的所有除数
Generating all divisors of a number given its prime factorization
本文关键字:分解 更新时间:2023-10-16
我想找到[1,107]范围内的所有数的除数。我知道它可以在O(sqrt(n))中求解。但在此之前,必须对Eratosthenes进行筛选,可以很容易地对其进行修改,以获得一个数的素数因子分解(通过跟踪每个数的一个素数因子)。所以我想知道使用素数分解生成所有因子会更有效吗
设n=p1k1*p2k<2**pmkm
我认为这个符号可以在筛后的O(m+∑kI)中得到
经过一番思考,我想出了以下代码来生成因子:
int factors[]={2,5}; // array containing all the factors
int exponents[]={2,2}; // array containing all the exponents of factors
// exponents[i] = exponent of factors[i]
vector <int> ans; // vector to hold all possible factors
/*
* stores all possible factors in vector 'ans'
* using factors and exponents from index l to r(both inclusive)
*/
void gen(int factors[],int exponents[],vector<int>& ans,int l,int r)
{
if(l==r)
{
int temp = 1;
for(int i=0;i<=exponents[l];i++)
{
ans.push_back(temp);
temp *= factors[l];
}
return;
}
gen(factors,exponents,ans,l+1,r);
int temp=factors[l];
int size = ans.size();
for(int i=1;i<=exponents[l];i++)
{
for(int j=0;j<size;j++)
{
ans.push_back(ans[j]*temp);
}
temp *= factors[l];
}
}
我认为它的时间复杂度至少是Ω(无因子)=Ω(π(1+kI))。
所以我的问题是:
1) 以这种方式生成因子比通常的(O(sqrt(n))循环方法)更快吗
2) 上面给出的代码可以优化吗?
第一个最明显的优化是预先分配答案向量。你确切地知道会有多少因子(因为你已经给出了π(1+ki)的公式)。
如果你自己管理堆栈而不是使用递归,你会得到最优化的解决方案(每个因子只需要1次查找和1次乘法)。
像这样的东西?
int factors_count = 1;
for (int i = 0; i < r; ++i)
{
factors_count *= 1+exponents[i];
}
ans.resize(factors_count);
ans[0] = 1;
int count = 1;
for (int stack_level = 0; stack_level < r; ++stack_level)
{
const int count_so_far = count;
const int prime = factors[stack_level];
const int exponent = exponents[stack_level];
int multiplier = 1;
for (int j = 0; j < exponent; ++j)
{
multiplier *= prime;
for (int i = 0; i < count_so_far; ++i)
{
ans[count++] = ans[i] * multiplier;
}
}
}
我甚至还没有试过编译它,所以请注意。
相关文章:
- 通过递归进行因子分解
- 有人能分解一下这个c++模板的语法吗
- C++ 乔列斯基因式分解
- 如何加快本征C++中的LU分解?
- 如何将整数分解为不同的变量?
- 减少本征的 QR 分解
- Xcode 中的加速框架以获得 A 的 QR 分解,但找不到 zgeqrf
- 将无向连接图分解为两个组件
- 在 C++ 中分解数字
- 分解SWIG Python接口 - 容器会产生命名空间冲突
- 对模板参数包操作进行因素分解
- 如何修复 LU 分解?
- 动态矩阵特征分解过程中的误差
- 正在从程序内存中分解x指令
- C++错误:此上下文中不允许使用分解声明
- 计算将整数n分解为4平方和的方法的数量
- 下面的代码是如何工作的?它输出分解的数字并且功能齐全,我只是不明白它是如何做到的
- 当我使用Connect信号和插槽时,会出现此分解错误
- 用C++打印指数形式的素数分解
- 如何分解嵌套的循环?