为具有相同结果的给定幂对计算不同项

Posted

技术标签:

【中文标题】为具有相同结果的给定幂对计算不同项【英文标题】:Computing different terms for a given pair of exponentiation having the same result 【发布时间】:2010-01-28 07:42:32 【问题描述】:

为了理解这个问题,让我们首先考虑这些例子:

                               46 = (22)6 = 212 = (23)4 = 84 = 163 = 4096

因此,我们可以说46、212、84和163 相同。

                               273 = 39 = 19683

所以,273 和 39 是相同的。

现在的问题是,对于任何给定的 ab 对,如何计算所有其他可能的(如果有的话)xy 其中,ab = xy。我对算法感兴趣可以在 C/C++ 中高效实现。

例如:

如果输入是这样的:

4,6 所需输出:(2,12),(8,4)

8,4 所需输出:(2,12),(2,6)

27,3 所需输出:(3,9)

12,6 所需输出:(144,3),(1728,2)

7,5 所需输出:No duplicate possible

【问题讨论】:

这是作业吗?如果是这样,请指定并提供您的初始尝试 不,这不是家庭作业。我只是好奇地想解决它,正是我从另一个问题中得到了灵感。 你的a 总是一个主要的力量吗?你所有的例子都是。或者可以是6 @AakashM:是的,它可以有任何价值。 【参考方案1】:

这主要是一道数学题。你可以提取一个数的所有质因数,你会得到一个质数及其指数的列表,即 216000 = 26 * 33 * 5 3。然后取指数的 GCD:GCD(6,3,3) = 3。将指数除以 GCD 得到数字的最小根,22 * 31 * 51 = 60。然后是 GCD 的因数 - 3 的因数是 1 和 3。有一种方法可以将数字表示为 GCD 的每个因数的整数幂。您可以将其表示为 (603)1 或 (601)3

编辑:修正数学错误。

【讨论】:

(12) 的 GCD 通常是 12。最小的根是 2^1。 12的因数是(1, 2, 3, 4, 6, 12),所以可以表示为(2^1)^12 = 2^12, (2^2)^6 = 4^6, (2^3)^4 = 8^4 这可能很明显,但是如果您不首先计算结果数而直接在基上进行因式分解,则可以避免处理非常大的数:毕竟,它的因式分解的任何结果 GCD可以简单地包含在指数中,然后对于这个解决方案它恢复正常。简而言之;分解基数; GCD 因式分解的指数最小化基数,将基数因式分解的指数的 GCD 因数与输入指数的因式分解相结合,迭代所有可能的指数因式分解。 @Eamon Nerbonne:你能详细说明一下吗? 例如:144^4;分别分解基数和指数: (2^4*3^2)^(2^2); GCD 基数和提取公指数:((2^2*3^1)^2)^(2^2);将基数的共享指数重写为“官方”指数的一部分: (2^2*3^1)^(2*2^2) == 12^(2^3) ;现在只需列出指数的所有可能因素;即 1、2^1、2^2 和 2^3。这里的加速在于您避免处理大数字(当然直到最后可能的时刻),如果您接受 (12^8)^1 形式的输出,则不需要计算大数字完全没有。【参考方案2】:

如果整数是您唯一感兴趣的东西,您可以开始从目标数中提取整数根,并检查结果是否为整数。

你甚至有一个方便的停止条件——只要根低于 2,你就可以停止。也就是算法:

给出结果 N 计算第 N 个根。 如果是整数:添加到答案中 如果是 N += 1,返回上一步

此算法将始终终止。

【讨论】:

这样做太天真了。如何在不计算 a^b 的情况下做到这一点? 我认为这个解决方案一点也不幼稚。事实上,我认为如果只使用整数算术(而不是暗示的浮点数)来实现,这个解决方案会很好用。 @Dietrich Epp:那你能不能提一下,我们如何避免这里的浮点计算? 所以子问题是:对于整数 N 和 X,确定 X 是否有整数 N 次根,如果有,计算它。例如,您可以使用二分算法来找到答案。从 1 和 X 的最粗略界限开始,您可以计算(估计)^N 幂并查看它是否小于、等于或大于 X,并根据该比较调整界限。 @Dietrich Epp:我不明白你为什么不屑一顾我的回答并称赞这个,因为除了向上而不是向下计数循环的问题之外,它们是相同的。【参考方案3】:

我相信这个问题等价于Integer factorization问题。

我这么说是因为我们可以将任何合数转换为素数的唯一乘积 (参见Fundamental theorem of arithmetic),然后开始创建因子和幂的组合。

更新: 例如:46

我们将其转换为素数的幂,所以我们有 212。 现在我们以指数方式增加底数,我们有:46, 84 ...直到指数变为 1。

【讨论】:

我知道整数分解。谢谢 :) 你能解释一下吗:then start creating combinations with the factors and the powers.【参考方案4】:

有意义的最小底数是 2。另外,有意义的最小指数是 2。

根据结果,您可以确定可能的最大指数。

示例:4096 = 2^12,最大指数为 12。

这也适用于不是 2 的幂的结果:19683 比 2^14 稍大,因此您不会看到任何大于 14 的指数。

现在您可以将您的数字从最高指数向下推至 2(最小指数)。对于每个试验指数 exp,取结果的 exp-th 根;如果结果是一个干净的整数,那么您已经找到了一种解决方案。

您可以使用对数来计算结果的 log2,并取数字的 n 次方根。但是您需要注意舍入错误。

这种方法的优点是,一旦你设置好了,你就可以运行一个简单的循环,一旦完成,你就会得到所有的结果。

【讨论】:

我认为使用浮点数来解决数论中涉及整数的问题是错误的。如果输入足够大,任何使用浮点的算法都会彻底失败(给出不正确的结果),在这种情况下,无法区分舍入误差和负结果。 那么为什么你删除了你的其他解决方案?我没明白你在step 2 中的意思?!! @Dietrich:如果您知道要注意舍入错误,则可以通过 (a) 舍入和 (b) 使用整数数学检查结果来避免该问题。我同意基于素数分解的解决方案会更有效;这只是一种替代解决方案。 @nthrgeek:我的另一个答案是质数分解方法,但解释得不好。其他的更好,所以我决定删除而不是详细说明。【参考方案5】:

我终于自己解决了。使用简单的整数分解算法,我的解决方案看起来像this。可以使用Pollard's rho algorithm进一步优化

编辑:代码更新,现在它可以处理复合基础。如果它也有某些其他错误,请指出:)

【讨论】:

我没有投票,所以我只是猜测否决票是因为您没有将任何答案归功于您。例如,Dietrich Epp 描述了完全正确的答案。 Eli Bendersky 还展示了如何避免整数分解。您的回答听起来好像对您没有帮助。 @abc:你检查我的解决方案了吗?没有冒犯他人,但现在还没有使用这里所说的内容。 您的程序看起来不正确。它只使用第一个素数的指数。您是否使用复合基础测试过您的程序?像 (12, 6) 这样的情况的输出是什么?

以上是关于为具有相同结果的给定幂对计算不同项的主要内容,如果未能解决你的问题,请参考以下文章

具有不同结果的相同公式字段

PHP / MYSQL - 计算有多少连续的前一周结果与当前一周具有相同的价值(音乐图表)

在具有相同 rem 的元素上,字体大小的计算方式不同

显然相同的数学表达式具有不同的输出

在同一选择语句中计算具有不同条件的相同 id 列

计算具有给定总和的子集的有效方法