找到相加等於2021的等差數列

劉新宇發表於2021-05-08

2020除夕晚上,我給了一道題目:如何不用暴力窮舉,找到相加為2021的等差數列。

時光匆匆過了5個月,我才來得及把這道趣題的思路整理一下。等差數列的求和公式大家都知道,a1 + a2 + ... + an = (a1 + an)*n/2。這說明2021作為等差數列的和,必須能夠分解成兩個整數的乘積。當然這裡有個前提條件,就是這個等差數列是不平凡的。平凡的等差數列只有一個元素,就是[2021]

怎樣因數分解2021呢,普通方法是試除,程式設計師可能會忍不住暴力求解。但是我們覺得這樣不夠優美。大家可能會想到用埃拉託斯特尼篩法,從2, ..., 2021用篩法篩除,找到因子。但這仍然屬於暴力解法。有一種用法國業餘數學家費馬命名的“費馬分解法”:如果2021=(a+b)(a-b)=a^2 - b^2,則2021 + b^2 = a^2。我們可以把2021加上一個小平方數,看看它是否等於另一個平方數。特別巧:2021 + 4 = 2025,其中4是2的平方,2025是45的平方。很多同學都背過25*25 = 625, 35*35 = 1225, 45*45 = 2025, ... 95*95 = 9025吧?於是2021=(45-2)(45+2) = 43 * 47

恰巧43, 47都是素數。於是我們知道2021只能分解為2個等差數列之和。(a1 + an)/2, n只能分別是43, 47或者反過來。這就是本題的答案。最後兩個等差數列分別是:

20+21+22+...+6626+27+28+...+68

最後留一道習題給大家:你能證明25*25 = 625, 35*35 = 1225, 45*45 = 2025, ... 95*95 = 9025這個口訣的正確性麼?x5 * x5 = [x(x+1)]25

更多數學內容見《同構——程式設計中的數學

相關文章