Algorithm 算法尽可能将因子分解为几个因子
是否有一个已知的算法将一个整数分解为尽可能少的因子(不一定是素数),其中每个因子都小于某个给定常数N 我不关心素数因子大于N的数字。同样,我也不处理大于几百万的数字,而因子分解是处理初始化的一部分,所以我并不特别担心计算的复杂性Algorithm 算法尽可能将因子分解为几个因子,algorithm,Algorithm,是否有一个已知的算法将一个整数分解为尽可能少的因子(不一定是素数),其中每个因子都小于某个给定常数N 我不关心素数因子大于N的数字。同样,我也不处理大于几百万的数字,而因子分解是处理初始化的一部分,所以我并不特别担心计算的复杂性 编辑:我只是想澄清一下。我已经有了找到主要因素的代码。我正在寻找一种方法,将这些因子组合成尽可能少的复合因子,同时使每个因子小于N。那么,如果你能找到一个因子,你就完成了,因为第二个因子就是你的数字除以第一个因子。要使它快速,只需使用一个素数筛。如果你的最大数字在数百万
编辑:我只是想澄清一下。我已经有了找到主要因素的代码。我正在寻找一种方法,将这些因子组合成尽可能少的复合因子,同时使每个因子小于N。那么,如果你能找到一个因子,你就完成了,因为第二个因子就是你的数字除以第一个因子。要使它快速,只需使用一个素数筛。如果你的最大数字在数百万范围内,我猜筛子不是很大。我不知道是否有一个既定的算法,但我会尝试以下方法
public static List<Integer> getFactors(int myNumber, int N) {
int temp=N;
int origNumber=myNumber;
List<Integer> results=new ArrayList<Integer>();
System.out.println("Factors of "+myNumber+" not greater than "+N);
while (temp>1) {
if (myNumber % temp == 0) {
results.add(temp);
myNumber/=temp;
} else {
if (myNumber<temp) {
temp= myNumber;
} else {
temp--;
}
}
}
for (int div : results) {
origNumber/=div;
}
if (origNumber>1) {
results.clear();
}
return(results);
}
公共静态列表getFactors(int myNumber,int N){
内部温度=N;
int origNumber=myNumber;
列表结果=新建ArrayList();
System.out.println(“系数“+myNumber+”不大于“+N”);
而(温度>1){
如果(myNumber%temp==0){
结果:添加(温度);
myNumber/=温度;
}否则{
如果(myNumber1){
结果:清晰();
}
返回(结果);
}
我希望它有帮助。您可以将问题分为两部分来解决:
从数学导入exp、log、sqrt
进口经营者
def factorize(n):
"""
通过试除法分解n,得到素因子。
>>>列表(因子分解(24))
[2, 2, 2, 3]
>>>列表(因子分解(91))
[7, 13]
>>>列表(因子分解(999983))
[999983]
"""
对于x范围内的p(2,int(sqrt(n))+1):
当n%p==0时:
产量p
n/=p
如果n==1:
返回
产量
def产品:
"""
返回序列“s”中项目的乘积。
>>>从数学导入阶乘
>>>乘积(xrange(1,10))==阶乘(9)
真的
"""
返回减少(operator.mul,s,1)
def包(对象、箱子大小、成本=总和):
"""
将“对象”中的数字打包到少量大小的箱子中
`bin_size`使用第一个拟合递减算法。可选
参数'cost'是一个计算箱子成本的函数。
>>>包装([2,5,4,7,1,3,8],10)
[[8, 2], [7, 3], [5, 4, 1]]
>>>len(包装([6,6,5,5,4,4,4,2,2,2,3,7,7,5,5,8,8,4,4,5],10))
11
"""
垃圾箱=[]
对于排序中的o(对象,反向=真):
如果o>bin_尺寸:
raise VALUERROR(“对象{0}大于bin{1}”
.格式(o、bin_尺寸))
对于垃圾箱中的b:
新成本=成本([b[0],o])
如果NexIf没有成本,如果一个因素大于n。考虑n是64,我从整数8192开始。我可以把它分解成2048×2。这不起作用,因为我需要所有的因素小于64。对于这种情况,我需要的因素(64, 64, 2)。.这个问题表明他不一定对素数感兴趣。@John哦,对了,我误解了你的问题。你能保证每个数字至少有一个小(素数)因子吗?我拒绝接受素数因子大于N+1的数字。我也想提一下装箱。我只是不明白对数的原因?装箱增加了一些东西。但OP正在寻找因子,所以他想乘法。所以Gareth正在使用等式log(a*b)=log(a)+log(b)这正是需要的。似乎如果我简单地将每个箱子的内容作为箱子中因子的乘积,我就可以避免显式地处理对数。是的,你可以用乘法而不是加法实现任何箱子包装算法。事实上,你最好这样做,因为这样可以避免问题ms是由数值不准确性引起的。但如果我用众所周知的问题来解释它,说明就更简单了。有一个问题:small_因子分解(2400,40)是否应该返回[25,24,4]?由于2400与40和32之间的其余部分都返回零,这些因素不是更可取吗?我知道箱子包装解决方案是启发式的,这是这个结果的根本原因,但这是理想的解决方案吗?感谢澄清-首先看起来所有因素都将小于N automat在逻辑上,即输入没有不小于N的因子。关于这个问题的有趣问题:假设你想要33的因子不大于3。有一个是素数(11)在我的问题空间中,我可以拒绝素数因子大于N的情况。那么33和3的理想解决方案是什么?没有,还是只有3?对于最大因子为3的因子分解33的情况,答案是没有。我需要所有因子的乘积为原始数呃。我不完全理解你的伪代码。你是说while(temp>1)
?什么是小写的n
?此外,OP希望得到尽可能少的因子。这似乎是在尝试将其完全分解(尽管它似乎不起作用)@Dilbert关于错误的看法是正确的,因此我用Java编写了算法并进行了测试。现在它运行得很好。这实际上是n