【问题标题】:Programming a number theory programme编写数论程序
【发布时间】:2014-06-02 07:54:15
【问题描述】:

我有这个东西,我想编程如下。

我们都知道接下来的两个身份:

32+42=52
33+43+53=63

现在,我想编写一个计算机代码(在数学、C 或 Python 中)来检查这种关系。

例如,对于 34+44+54+64 将其与 7 进行比较4 并检查它是否等于它,我的意思是我想检查更多上述数字序列的情况,并比较它们是否确实构成上述序列。

基本上我知道我需要一个循环和条件,我的问题是如何保持数字 3,4,5,6,... 以继续在序列中生成?

这是我不知道如何编写此代码的地方。

我的意思是我想检查最多 i=10,000,即: 3i+4i+5i+... 是否等于 (3+i)i 等...

希望你能理解我的问题。

提前致谢。

【问题讨论】:

  • 我相信 $ 用于在 LaTex 中开始和结束公式环境。
  • 您是否考虑过这可能需要多长时间?信封数量级的猜测是可以接受的。 4 个变量的草率方法是一个循环,将每个变量从 1 带到 10000。即 (10^4)^4 = 10^16 次操作。如果程序每秒可以执行 1,000,000 次操作,那就是 10^10 秒。谷歌告诉我“10^10 秒”是 316.8 年。
  • 确实,科多尔。我只是在太多的 stackexchange 网站上注册,并且在数学和物理中他们使用乳胶,所以美元符号来自那里。 ^ 是幂,例如 3^2 = 3*3;等等
  • 你几乎已经写过了:$\sum_{0 只需替换总和有一个循环,你会有一些代码给我们看。
  • @Paul,不,我没想到这可能需要多长时间;只是出于好奇,我只是想检查一下是否还有更多的案例。我不知道怎么写这样的代码,因为我一直需要增加序列和改变指数。

标签: python c math numbers wolfram-mathematica


【解决方案1】:
for pow in xrange(2,5):
    sum=0
    for index in xrange(3,3+pow):
        sum+=index ** pow
    if sum==(index+1) ** pow:
        print True

#output is for power 2, 3 it works

我认为它的范围是 2,5

即第一个循环计算3**2 + 4 **2 ==5 **2 ..soo on

将所有 10000 次幂的 pow 范围增加到 10001

【讨论】:

  • index+1 **pow - 这真的如你所愿吗?
  • @Hammerite 是的,实际上第一个循环索引值为 3,4,我想将它等同于 index=4 +1 的最终值,即 5..
  • @Hammerite 感谢您的纠正我已经编辑了我的问题
【解决方案2】:

意思是我要检查最多 i=10,000,即:3i+4i+5i+... 是否等于 (3+i)i 等...

考虑range 的工作方式,仅在True 时打印:

limit = 10000
for pow in range(2, limit + 1):
    if ((3 + pow) ** pow == sum([exp ** pow for exp in range(3, 3 + pow)])):
        print pow

【讨论】:

  • 虽然是的,但现在有点烧掉我的资源;)
  • 我昨天运行了它(打印最多 10003 个错误案例),它刚刚完成:真正的 1460m14.559s 用户 1452m28.582s sys 3m5.596s
【解决方案3】:

这会尽量避免重新计算。

>>> def f(n):
...    c = 1
...    L1 = [3]
...    L2 = [1]
...    while (c + 3 < n):
...       L2 = [L1[i] * L2[i] for i in range(c)]
...       c += 1
...       x = (c + 2) ** (c - 1)
...       print(c, x == sum(L2))
...       L1.append(c + 2)
...       L2.append(x)
...
>>> f(10)
(2, False)
(3, True)
(4, True)
(5, False)
(6, False)
(7, False)
>>>

【讨论】:

  • 公平地说,最快的答案是if (pow &gt; 3) print "Don't waste your time." ;)
  • @icedwater,你有这个说法的证据吗? (虽然我的猜测是这些确实是唯一的情况)。
  • 如果你计算(n+3)^n - Sum[ (i+2)^n , {i,1,n} ],你会看到它对n&gt;3 单调爆炸。这证明(或一个开始)没有更多的解决方案。
  • 我有这个说法的证明,但它太小了,不适合这个边距......好吧,说真的,我没有考虑过,但这也是我的猜想。事实上,我很惊讶第二个案例奏效了。
  • @George,我想我可以在这里使用 (n+3)^n 的二项式,然后通过归纳表明它大于 (i+2)^n 对于 n>3 的总和.在我完成其他工作后,我会稍后检查这个。感谢大家的帮助。
【解决方案4】:

嗯,在 Mathematica 中这很容易:

For[i = 3, i < 101, i++ ]
If[Sum[(3 + j)^i, {j, 0, i - 1}] == (3 + i)^i, Print[i]]

我很确定在其他编程语言中它可能运行得更快。

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多