問題
已知,
饥追,求
這是小朋友問我的一個題目图仓,第一感覺就是用求根公式解方程組,分別求出和
的解但绕,然后代入
救崔,然后解決完畢,呵呵捏顺!
解法一:粗暴解法
先給出一個定理: 設(shè)一元二次方程的兩個根
和
帚豪,
由求根公式可以得到
根據(jù)條件可以得到和
是一元二次方程
的兩個根。由一元二次方程的求根公式可知
然后
問題如果用計算器計算無理數(shù)草丧,可能會丟失精度狸臣,更何況沒有計算器,對于這種無理數(shù)的高次冪運算需要用到二項式定理昌执,太費CPU
了烛亦,這不是正解诈泼。
解法二:迭代法
先求解根的低次冪和
然后驚奇地發(fā)現(xiàn),這不是斐波那契額數(shù)列
Fibonacci sequence
的特性嗎?
于是就直接得出
所以煤禽,解決完畢铐达,但是這畢竟是猜想,結(jié)果雖然是正確的檬果,但是不嚴謹瓮孙!而且如果題目的條件變化了,是不是都滿足
Fibonacci sequence
的特性呢选脊?由此引出了這樣的問題:如果我們知道了兩個未知數(shù)的和以及乘積杭抠,是否可以知道所有根的任意次冪的和呢?是不是可以更加泛化一下呢恳啥?
泛化問題
已知偏灿,
,
求
解:
令翁垂,則
于是得到了以下的遞推公式:
那么對于原始問題已知
可以得到
由此驗證了解法二的嚴謹性。
延拓新的問題
如果沒有實數(shù)解硝桩,以上方法是否適用?
看一個例子,對于泛化的公式,如果沿猜,
即
顯然
那么
按照遞推公式
貌似也ok,待證明
總結(jié)一下泛化問題
對于已知碗脊,
邢疙,
求
就會有
最后用python
代碼實現(xiàn)一下
# a是和, b是積, n是冪
def solution(a,b,n):
if(n == 0):
return 2
if(n == 1):
return a
return a*solution(a,b,n-1)- b*solution(a,b,n-2)
運行結(jié)果
>>> print(solution(1,-1,0))
2
>>> print(solution(1,-1,1))
1
>>> print(solution(1,-1,2))
3
>>> print(solution(1,-1,3))
4
>>> print(solution(1,-1,4))
7
>>> print(solution(1,-1,5))
11
>>> print(solution(1,-1,6))
18
>>> print(solution(1,-1,7))
29
然后
>>> print(solution(1,-1,100))
# 等了好久都沒算出來
# 容易理解的算法性能差望薄,性能好的算法不容易理解疟游,這就是生活!:壑А0渑啊!
經(jīng)典優(yōu)化方案卧须,空間換時間:
def solution(a,b,n):
sn,s0,s1 = 0, 2, a
for i in range(1, n):
sn = a*s1 - b*s0
s0 = s1
s1 = sn
return sn
測試100
>>> print(solution(1,-1,100))
792070839848372253127
# 計算結(jié)果秒出了