背景介绍
小探索,先做个记录。
给小伙伴看代码,突然发现小伙伴把所有求平方根的函数都用math.sqrt()
完成的,而我比较习惯()**0.5
这样的用法。看见之后忍不住想改,但是转念一想这两种方法到底哪个快啊?于是编写了一个测试程序,对这两种方法对比了一下。测试结果是前者比较好,所以小伙伴的代码我也就没改。不过在测试中我发现了一个有趣的事情。
先看下面的测试代码,两个函数都是给出一个正整数num,然后求 1 + 2 + … + n u m \sqrt{1}+\sqrt{2}+…+\sqrt{num} 1+2+…+num。
import math as m
def f(num):
a = 0
for i in range(num):
a += m.sqrt(num)
return a
def f1(num):
a = 0
for i in range(num):
a += num**0.5
return a
事情奇怪就奇怪在当我用num=10,100,1000,10000,100000分别测试的时候发现当两个num为100倍的关系的时候最后的求和结果是大约1000倍的差别(差值大概不超过10e-5),而且如果num恰好是某个整数的平方的时候两者完全相等!
提出问题
于是我便有了如下猜想:
对于 ∀ n ∈ N + , 设 S ( n ) = 1 + 2 + ⋯ + n \,\forall n \in N^+,设\, S(n)=\sqrt{1}+\sqrt{2}+\cdots +\sqrt{n} ∀n∈N+,设S(n)=1+2+⋯+n
求证: S ( 100 n ) = 1000 S ( n ) S(100n)=1000S(n) S(100n)=1000S(n)。
目前进展
几个比较有用的结论:
n α + 1 α + 1 < ∑ i = 1 n i α < ( n + 1 ) α + 1 α + 1 ( α > 0 ) \frac{n^{\alpha+1 }}{\alpha+1}< \sum_{i=1}^{n} i^{\alpha}<\frac{(n+1)^{\alpha+1 }}{\alpha+1}\qquad (\alpha>0) α+1nα+1<∑i=1niα<α+1(n+1)α+1(α>0)
下面这张图片是从百度知道上找到的,但是不知道为什么,我再去照这个网页的时候却一直找不到,如果你看到了,欢迎在下面留言,我把链接放上来。
其它问题
1、测试代码的优化
除了上面序列求和的问题以外,还有一个是关于我上面测试代码的问题。那就是当n变得越来越大的时候,求解S(n)会很费劲。尤其是在提出问题节段,可能要对百万千万以内的所有数进行数值检验,这个时候求解速度会变慢很多。从代码中也不难看出,当对n以内的数据进行遍历的时候存在很多重复计算。
那么,我的问题就是,采用什么算法可以优化上述过程,减小计算量?
2. 对于其他幂次会有什么样的结论?
上面的探讨都是基于 S ( n ) = 1 + 2 + ⋯ + n S(n)=\sqrt{1}+\sqrt{2}+\cdots +\sqrt{n} S(n)=1+2+⋯+n进行的,如果不是平方根而是下面的表达式:
S ( n ) = 1 3 + 2 3 + ⋯ + n 3 S(n)=\sqrt[3]{1}+\sqrt[3]{2}+\cdots +\sqrt[3]{n} S(n)=31+32+⋯+3n
S ( n ) = 1 5 + 2 5 + ⋯ + n 5 S(n)=\sqrt[5]{1}+\sqrt[5]{2}+\cdots +\sqrt[5]{n} S(n)=51+52+⋯+5n
S ( n ) = 1 7 + 2 7 + ⋯ + n 7 S(n)=\sqrt[7]{1}+\sqrt[7]{2}+\cdots +\sqrt[7]{n} S(n)=71+72+⋯+7n
那么又会有怎样的相似规律呢?