Algorithm 给定一个整数,找到给定该整数的最小函数
我有一个非常大的正整数(百万位数)。我需要用尽可能小的函数来表示它,这个数字是可变的,这意味着,我需要一个生成尽可能小的函数的算法来得到给定的数字 示例:对于号码29512665430652752148753480221977363143592725170438328860638476943433478020332709411004889,算法必须返回“9^99”。它必须能够分析数字,并始终返回表示数字的数学函数。例如,号码21847450052839212624230650202990223514256705010491275188081282394862932355202必须返回“9^5^16+1”。听说过吗 回答你的问题:除非你把自己限制在某些特定的函数集内,否则这是不可能的 编辑:即使在您的示例中,您如何知道21的最短表示形式847450052839212624230656502990235142567050104912751880812823948662932355202实际上是9^5^16+1?即使在这种特殊情况下也很难证明吗 如果您将自己限制在某些函数集内,则可以使用以下算法:Algorithm 给定一个整数,找到给定该整数的最小函数,algorithm,math,compression,Algorithm,Math,Compression,我有一个非常大的正整数(百万位数)。我需要用尽可能小的函数来表示它,这个数字是可变的,这意味着,我需要一个生成尽可能小的函数的算法来得到给定的数字 示例:对于号码29512665430652752148753480221977363143592725170438328860638476943433478020332709411004889,算法必须返回“9^99”。它必须能够分析数字,并始终返回表示数字的数学函数。例如,号码218474500528392126242306502029902235
For i = 1 to n
enumerate all strings s of length i
if s represents a valid expression according to rules chosen a priori,
and evaluates to the number in the input,
return s
它一定会停止,因为在外循环(i=n)的最后一次迭代中,您最终将看到一个字符串包含输入的逐字
当然,这不是很有效。特别是O(bn),其中n是输入的长度,b是字母表的大小。扩展@ybungalobill的简洁答案,您的函数相当于计算任意字符串的Kolmogorov复杂度的函数。(如果将非常大的数字中的每个数字都视为字符,并将数字视为字符序列,则等价性是显而易见的。) 根据Kolmogorov complexity上的Wikipedia页面,给出字符串
s
复杂性的K(s)
函数是。(该页包括一个校样。)
换句话说,您想要的算法根本不存在
@布鲁拉贾-丹尼·普夫卢霍夫特:是的,是的。我试图创建一些使用这种算法的压缩,但顺便说一句,这是不可能的
这是因为从技术上讲,出于同样的原因,压缩任意数据是不可能的,但这并不能阻止我们这样做:)
然而,有更好的压缩数据的方法。例如,看一看。它是如此无处不在,以至于你几乎可以肯定地找到一个库来为你做压缩,而不管你用什么语言写。是另一个流行的
希望有帮助 如果你不是在寻找最优性,而是一份相当不错的工作,那么你可以使用一些启发式方法。例如,尝试使用以下所有方法分解n
n = a^k + b
对于k=2,3,…,记录n
,然后选择a+b
最小的一个。您可以使用a=floor(n^(1/k))
和b=n-a^k
计算a
和b
。然后在a
和b
上递归
当然,这只使用求幂和加法来找到一个好的压缩。如果您也允许减法,请改用a=round(n^(1/k))
并将b
设为负数
同时允许乘法会使它变得更加困难,因为您可能需要考虑
n
这是一个练习吗?作业如果是,请说清楚。对于你的答案,如果数字被排序,最快的方法是使用二分法,否则就做一个经典循环。@gspr:一个非常简单的例子,它更小,1048576
或2^20
?@Stephen:我可能只是误解了他在问题中“小”的意思。@David:这不仅仅是“目前”不可能的,这是不可能的。字符串的Kolmogorov复杂性是不可计算的。好吧,我可以限制某些函数集。@Frederico:即使你限制,对于绝大多数数字来说,计算出该数字的最短“函数”仍然是数字本身。虽然您给出的示例可以压缩为“9^99”,但大多数数字不能压缩。