正整数中有些数字是可以由连续的自然数相加而得,比如
1+2=3
4+5=9
2+3+4=9
这里再列出它的三个问题:
1、 写一个程序,对于任意64位正整数,输出它所有可能的连续自然数之和的算式?
2、 怎么样的数字是不能由连续的自然数相加而得,并且证明?
3、 64位正整数范围内子序列数目最多的数是哪一个?能否用数学知识推导出?(未做出)
我的分析:
1、 列举并归纳分析
首先我罗列了1~20以内所有正整数的一些累加可能。
1 不可能
2 不可能
3=1+2
4不可能
5=2+3
6=1+2+3
7=3+4
8不可能
9=4+5
10=1+2+3+4
11=5+6
12=3+4+5
13=6+7
14=2+3+4+5
15=1+2+3+4+5
16 不可能
17=8+9
18=3+4+5+6
19=8+9
20=2+3+4+5+6
以上罗列仅仅是罗列了那些可能数字的一组组和方式(比如15有7+8、4+5+6、1+2+3+4+5三种,这里就只举例一种)。
结论:
我发现唯一那些不可能自然数累加的正整数(1、2、4、8、16)之间的关系是他们均是2的n次方。
1=2^0、2=2^1、4=2^2、8=2^3、16=2^4
所以对于第二个问题,这个结论就是我提出的假设性答案(之后会证明)
2、 拆分数字得出公式
假如有一个正整数N,并且它是可由连续的自然数相加而得。得
N=a1+a2+a3+… …+an (a1、a2、a3…an 均为连续自然数)
然而a1、a2、a3…an又可以拆分成如下形式:
a1=1+k
a2=2+k
a3=3+k
… …
an=n+k
n为正整数、k为正整数或0
则N变成了如下形式
N=((1+k)+(2+k)+(3+k)+… …+(n+k))=(1+2+3+… … +n)+k*n=1/2*(1+n)n+kn=f(n,k)
也就是说,对于任意一个连续自然数相加的数字都可以由函数f(n, k)求得。
(以上隐含的条件是n=1时是不成立的。因为n代表连续自然数相加的个数,n为1时无意义。)
(注:其实一种更好的推导方法是根据等差数列求和公式来推导。我不用等差数列求导是因为我这个方法个人认为更容易以编程的方式求出。最后会给出具体实现代码。)
3、 证明公式与我的假设性答案的关系
假设函数f等于2^m(为了不混淆等式两边的n,2的次方我用m表示)
f(n, k)=1/2*(1+n)n+kn=2^m
(1+n)n+2kn=2^(m+1)
n((2k+1)+n)= 2^(m+1)
等式左边n((2k+1)+n)无论n,k取什么数字,n((2k+1)+n)的结果必然是奇数×偶数=偶数,而偶数又不能推导一定不等于2的n次方。不过这个结论(奇数×偶数)很重要。待我继续证明。
假设n((2k+1)+n)=Z。
因为Z是偶数,必定可以拆分成Z=2×Z1,如果Z1是偶数,必定有可以拆分成Z1=2×Z2,以此类推必定可以推出Z(n-1)=2×Zn,则Z=2×2×… …×Zn=2^n×Zn
这里的Zn代表是不可除2的一个奇数。
如果这个奇数可以被拆成两个数字相乘,则必然得出的还是两个奇数(O1, O2)。O1和O2中有至少一个还能继续拆分成两个奇数相乘,则还是得出奇数O3,O4。以此类推,最终不可能被拆分的奇数只可能是质数。也就是说,前面证明的结论Zn等于一组质数和2的n次方相乘而得。如果这组质数的元素个数为0,我们假设则该乘积为1。
至此,我得出了一个比较有趣的推论:
对于连续自然数相加函数f(n, k),必然可以得出一组连续质数相乘(pn1×pn2×pn3×… …pnX)×2^n=2^(m+1)
(pn1×pn2×pn3×… …pnX)=2^(m+1-n) (m+1>=n)
也就是说,当且仅当这组质数个数为0个,乘积为1且n=m+1时,连续自然数相加的和等于2的n次方。
但是根据函数公式,连续自然数相加必然是由奇数×偶数的乘积,而且至少一个非1的奇数存在。如果奇数为1,那么函数得出的值只可能是1,而1显然不符合题意。题意中的数字至少是从3开始,3是最小的连续自然数相加的数。
所以,连续自然数相加得出的函数f(n, k)必然不等于2的n次方。