Math 按词法顺序求和到给定数字的第n个千人组

Math 按词法顺序求和到给定数字的第n个千人组,math,numbers,partition,Math,Numbers,Partition,A要求按照词汇顺序(从低到高)找到答案 a+b+c+d..=x 其中a,b,c,d…是介于0-999和x之间的任意数目的整数 是一个固定整数 给出了一个答案,该答案使用python完全有效地计算了这一点 然而,对于非常大的数量,循环可能需要几年才能完成 例如,庞大的数字: 304153525784175759 是x=2700的解决方案,因为三人组加起来就是2700 304+153+525+784+175+759=2700 然而,通过算法循环得到等于这个数字的第n个解需要几个月或几年的时间 有没有

A要求按照词汇顺序(从低到高)找到答案

a+b+c+d..=x

其中a,b,c,d…是介于0-999和x之间的任意数目的整数 是一个固定整数

给出了一个答案,该答案使用python完全有效地计算了这一点

然而,对于非常大的数量,循环可能需要几年才能完成

例如,庞大的数字:

304153525784175759

x=2700
的解决方案,因为三人组加起来就是
2700

304+153+525+784+175+759=2700

然而,通过算法循环得到等于这个数字的第n个解需要几个月或几年的时间

有没有办法直接计算第n个解?也就是说,对于一个已知的解决方案,计算有多少个解决方案比这个解决方案少。

编辑:这篇文章只讨论如何在给定特定解决方案的情况下找到下一个解决方案

OP还要求:

  • 给定索引
    n
    查找
    n
    th解决方案,而无需生成所有先前的解决方案
  • 给定一个解决方案
    a
    ,找出存在多少较小的解决方案
当算法有效地找到下一个解决方案时,您只需填写当前解决方案

以下是一种将当前解决方案填充为大整数或字符串的方法:

start = 304153525784175759  # start = '304,153,525,784,175,759'
x = 2700
grouping = 3
max_in_group = 10**grouping - 1

if start is not None:
    if isinstance(start, str):
        a = [int(s) for s in start.split(',')[::-1]]
    else: # suppose start is a large integer
        a = []
        while start != 0:
            a.append(start % (max_in_group+1))
            start //= max_in_group+1
else: # no start value given, start with the smallest
    a = [x]
如果您将此预处理到的其余部分,您将获得以下输出:

304,153,525,784,175,759
304,153,525,784,176,758
304,153,525,784,177,757
304,153,525,784,178,756
304,153,525,784,179,755
304,153,525,784,180,754
304,153,525,784,181,753
304,153,525,784,182,752
304,153,525,784,183,751
304,153,525,784,184,750
304,153,525,784,185,749
304,153,525,784,186,748
...

下面是一种查找解决方案索引的方法(或:有多少个较小的解决方案)。该守则分为两部分:

  • 对于给定的和
    x
    ,找出一些固定数目的
    n
    组有多少个解。这是一个递归函数。基本上,对于
    n
    组和sum
    x
    ,对于从0到999的所有k,总结有
    n-1
    组和sum
    x-k
    的解决方案的数量。由于递归函数通常使用相同的值调用,因此结果存储在记忆词典中,以便下次立即使用

  • 使用此函数可计算存在多少较小的解决方案。这是一种类似的求和方法。例如,对于6组,从
    304
    开始,计算有多少5组在
    303
    之后开始,并求和到
    x-303
    ,将以
    302
    开始并求和到
    x-302
    的5组数相加,等等。然后,以
    304153
    为开始,查找在
    304152
    之后开始的4组数量,并求和到
    x-304-152
    ,以此类推

这是完整的代码,测试了相当多的输入(由上一个程序生成的测试)。对于给定的18位数字,只需几秒钟

分组=3 分组中的最大分组=10**分组-1 数字至测试=304153525784175759#数字至测试='3041535257841759' d={}#记忆词典 #计算n组求和到x的解的数量,每组为0到最大值的数字; #计算简单数字和时,n为位数,组中的max_应为9; #当以千为一组进行计数时,n是组数(数字/3),组中的最大值应为999 def计数数字(x,n,组中最大值=9):
如果不是(0)什么是第一个解决方案?从
n
-th解决方案到
n+1
-th解决方案的规则是什么?@HighPerformanceMark不确定。链接问题中有一个循环算法。不确定如何将其分解为单个公式这是枚举组合学中一个非常重要的问题。你是必不可少的ly请求从秩(索引)开始的
unrank
函数对于那个等级的组合对象。也许是一个更好的提问的地方。@johncolman在那里尝试过。但他们不知道。这是一个非数学操作,所以可能是johanC的解是最好的解。这给出了它是多少个解吗?也就是说,这是从最低到最高的25000个解吗?不,找到确切的有多少个早期解是这是一个更棘手的问题。同时,给定索引,找出对应于它的解决方案。可能有一个递归公式?是的,确实如此。当前循环需要几个月甚至几年才能完成大的值。我的主要问题是“给定解a,找出存在多少较小的解”好的,谢谢。我想也许计算机算法是“数字总和:2700”的唯一方法-有没有办法改变这个数字?它只是输入的三个数的总和。否则,你不能给输入的数字加索引。如果你替换
x=sum(a)
通过另一个值,该函数仍能正确计算小于输入的解决方案数。
number to test: 304,153,525,784,175,759
numbers should sum to: 2700
number of smaller solutions: 180232548167366
index of this solution: 180232548167367