任何数字行的几何级数

时间:2010-09-29 18:06:46

标签: math numbers series

我可以有任意数字行,包含2到10个数字。从这一行开始,我必须得到几何级数。

例如: 给定行号:125 5 625我必须得到答案5。行:128 8 512我必须得到答案4

你可以帮我一把吗?我不是要求一个程序,只是一个提示,我想自己理解它并自己写一个代码,但是该死的,我一整天都在思考,无法弄清楚这一点。

谢谢。

不要写整个程序!

伙计们,你们没有得到它,我不能简单地分裂。我实际上必须获得几何级数+显示所有数字。在128 8 512行中,所有数字都是:8 32 128 512

5 个答案:

答案 0 :(得分:4)

Seth's answer是正确的。我在这里留下这个答案,以帮助详细说明为什么128 8 512的答案是4,因为人们似乎遇到了麻烦。


几何级数的元素可以用c*b^n形式书写,其中b是您要查找的数字(b也必须大于1),{{1} }是一个常数,c是一些arbritrary数字。

所以最好的选择是从最小的数字开始,对其进行分解并查看所有可能的解决方案,以n形式编写,然后在剩余数字上使用c*b^n。返回有效的最大结果。

所以对于你的例子:

b

从5开始是5,所以它只能用一种方式编写:125 5 625 。所以你的5 = 1*5^1是5.你现在可以停下来,假设你知道这行实际上是几何的。如果你需要确定它是否是几何的,那么在剩下的数字上测试b

b

128 8 512 可以多种方式撰写:88 = 1*8^18 = 2*2^28 = 2*4^1。因此,8 = 4*2^1有三个可能的值,b有几个不同的选项。先尝试最大的。 c不起作用。试试8。有用! 4128 = 2*4^3。因此512 = 2*4^4b4c

2

这个有点意思,因为第一个数字是素数,但不是3 15 375 ,而是b。因此,您需要确保如果您的第一个c - 候选人不能处理其余数字,您必须查看下一个最小数字并对其进行分解。所以在这里你要分解15:b(简并案例),15 = 15*?^015 = 3*5^115 = 5*3^1。答案是5,15 = 1*15^1,所以它可以解决。

答案 1 :(得分:2)

编辑:我认为现在应该是正确的。

该算法不依赖于因子分解,仅依赖于欧几里得算法及其近似变量。这使得它在数学上比使用因子分解的解决方案稍微复杂一些,但它会更快。如果你理解欧几里德算法和对数,那么数学就不应该成为问题。

(1)对数字组进行排序。您的数字为ab^{n1} < .. < ab^{nk}

示例:(3 * 2, 3*2^5, 3*2^7, 3*2^13)

(2)形成一个新列表,其中排序列表的第(n + 1)st个元素的第n个元素除以第(n)个。您现在有b^{n2 - n1}, b^{n3 - n2}, ..., b^{nk - n(k-1)}

(续)示例:(2^4, 2^2, 2^6)

定义d_i = n_(i+1) - n_i(不要编程这个 - 你甚至不想,因为n_i是未知的 - 这只是为了解释程序是如何工作的。)

(续)示例:d_1 = 4, d_2 = 2, d_3 = 6

请注意,在我们的示例问题中,我们可以自由选择(a = 3, b = 2)(a = 3/2, b = 4)。底线是“真实”b的任何权力,它将步骤(2)中列表中的所有条目分开是正确的答案。由此可见,我们可以将b提升到除以d_i之外的任何幂(在这种情况下,任何除以4,2和6的幂)。问题是我们既不知道b也不知道d_i。但是如果我们让m = gcd(d_1, ... d_(k-1)),那么我们就可以找到b^m,这就足够了。

注意:鉴于b^ib^j,我们可以使用以下网址找到b^gcd(i, j)

log(b^i) / log(b^j) = (i log b) / (j log b) = i/j

这允许我们使用欧几里德算法的修改版本来查找b^gcd(i, j)。 “行动”全部在指数中:加法已经被乘法,乘以取幂和(因此)带有对数的商取代:

import math
def power_remainder(a, b):
    q = int(math.log(a) / math.log(b))
    return a / (b ** q)        

def power_gcd(a, b):
    while b != 1:
    a, b = b, power_remainder(a, b)
    return a

(3)由于原始集合的所有元素因r = b^gcd(d_1, ..., d_(k-1))的幂而不同,因此它们都是cr^n形式的所有元素。但是,c可能不是整数。如果这是一个问题,请告诉我。

答案 2 :(得分:0)

最简单的方法是将数字分解并找到它们共有的最大数字。但要小心,因子分解具有指数级的复杂性,因此如果你在行中获得大数字,它可能会停止工作。

答案 3 :(得分:0)

你想要的是知道连续所有数字的最大公约数。

一种方法是检查它们是否可以除以行中较小的数字。

如果没有,请尝试行中较小数字的一半。

然后继续往下走,直到找到一个将它们全部分开或你的除数等于1的数字。

答案 4 :(得分:0)

Seth Answer不正确,例如,在解决方案不解决128 8 2048行的情况下(2 * 4 ^ x),您得到: 8 128 2048 =&gt; 16 16 =&gt; GCD = 16

确实,解决方案是此结果的一个因素,但您需要对其进行分解并逐个检查正确答案是什么,在这种情况下,您需要以相反的顺序检查解决方案因素{{1直到你看到4个匹配所有条件。