Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定一个整数,找到给定该整数的最小函数_Algorithm_Math_Compression - Fatal编程技术网

Algorithm 给定一个整数,找到给定该整数的最小函数

Algorithm 给定一个整数,找到给定该整数的最小函数,algorithm,math,compression,Algorithm,Math,Compression,我有一个非常大的正整数(百万位数)。我需要用尽可能小的函数来表示它,这个数字是可变的,这意味着,我需要一个生成尽可能小的函数的算法来得到给定的数字 示例:对于号码29512665430652752148753480221977363143592725170438328860638476943433478020332709411004889,算法必须返回“9^99”。它必须能够分析数字,并始终返回表示数字的数学函数。例如,号码218474500528392126242306502029902235

我有一个非常大的正整数(百万位数)。我需要用尽可能小的函数来表示它,这个数字是可变的,这意味着,我需要一个生成尽可能小的函数的算法来得到给定的数字

示例:对于号码29512665430652752148753480221977363143592725170438328860638476943433478020332709411004889,算法必须返回“9^99”。它必须能够分析数字,并始终返回表示数字的数学函数。例如,号码21847450052839212624230650202990223514256705010491275188081282394862932355202必须返回“9^5^16+1”。听说过吗

回答你的问题:除非你把自己限制在某些特定的函数集内,否则这是不可能的

编辑:即使在您的示例中,您如何知道21的最短表示形式​847​450​052​839​212​624​230​656​502​990​235​142​567​050​104​912​751​880​812​823​948​662​932​355​202实际上是9^5^16+1?即使在这种特殊情况下也很难证明吗

如果您将自己限制在某些函数集内,则可以使用以下算法:

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”,但大多数数字不能压缩。