Algorithm 算法尽可能将因子分解为几个因子

Algorithm 算法尽可能将因子分解为几个因子,algorithm,Algorithm,是否有一个已知的算法将一个整数分解为尽可能少的因子(不一定是素数),其中每个因子都小于某个给定常数N 我不关心素数因子大于N的数字。同样,我也不处理大于几百万的数字,而因子分解是处理初始化的一部分,所以我并不特别担心计算的复杂性 编辑:我只是想澄清一下。我已经有了找到主要因素的代码。我正在寻找一种方法,将这些因子组合成尽可能少的复合因子,同时使每个因子小于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){
结果:清晰();
}        
返回(结果);
}

我希望它有帮助。

您可以将问题分为两部分来解决:

  • 用任意一种方法把你们的数分解成素数。对于一个只有几百万的数,试除法就可以了

  • 取每个因子和大小对数N的对数

  • 现在,装箱是可行的,但在实践中,可以使用简单的技术找到好的近似解:第一次拟合算法装箱不超过最佳装箱数量的11/9倍(加上一个装箱)

    下面是Python的一个实现:

    从数学导入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