佩爾方程例項講解

2021-09-25 05:22:40 字數 3043 閱讀 7878

佩爾方程是一種不定二次方程。

下面的不定方程稱為佩爾(pell)方程:

x^2-d*y^2= 1 ........①

其中 d 為正整數,若 d 是完全平方數,則這個方程式只有平凡解(1,-1,0)。若 d 是非平方數。佩爾方程存在無窮多個解。

若佩爾方程的最小特解(最小正整數解)是(x1,y1),那麼可有迭代公式:

除了上述常見的佩爾方程,還有一種形式。下面的不定方程稱為第ii型佩爾(pell)方程:

x^2-d*y^2= -1 ........②

如果②有正整數解,設(a,b)是②的正整數解中使 x+y√d 最小的解(稱(a,b)為②的基本解),則②的全部正整數解可以表示為:

x+y√d=(a+b√d)^(2n+1) (n為任意正整數)
而且記x0+y0√d=(a+b√d)^2,則(x0,y0)為①的基本解。

關於公式②的通解,可以前往閱讀數論筆記 · 佩爾方程,該文章對此進行了詳細講解。這裡我們就直接拿來使用。

如上圖所示,當 k 為 -1 時,即和公式②一致,此時 p,q 為公式②的解,(r,s)為公式①的基本解。將公式①和公式②進行相乘,最終得到(x,y)的通解。假設 d 為 2,公式①的基本解為(3,2),則(x,y) = (3p±4q,2p±3q)。

案例一

記得有一次全班去唱k, 其中有個活動是情歌對唱. 具體操作流程是這樣的:

準備好 21 個鬮(我們班 15 男 6 女), 其中只有兩個是有標記的, 每人隨意抓取乙個, 最後取到有標記的鬮的兩個人去點首情歌對唱.

旁邊一哥們兒幽幽地對我說, 看來攪基真是神的安排啊, 你看我們班的男女人數, 攪基的機率 c(15,2)/c(21,2) 剛好是 1/2.

給跪了, 這哥們兒對數字太敏感了, 簡直是拉馬努金轉世啊. 不過我隨之想到乙個問題: (21, 15) 真的是神的唯一安排嗎? 其實不是的,

神還有很多類似的安排. 比如 (4, 3), 顯然 c(4,2)/c(3,2) 也等於 1/2, 當然還有 (120, 85) 等等等等.

神的安排太多太多了, 如果我們定義 (n, m) 是乙個安排(其中 1 < m < n), 而如果 c(m,2)/c(n,2) = 1/2, 它就是神的安排.

現在的問題是, 給你乙個不大於 10^9 的正整數 n, 有多少組神的安排 (n, m) 滿足 n <= n 呢?

分析:

根據題意列出方程2*m^2-2*m=n^2-n,轉換為佩爾方程形式:(2*n-1)^2-2*(2*m-1)^2=-1

記 x = 2n-1,y=2m-1,原方程即為:x^2-2*y^2=-1。為了求解該方程的通解,需要先計算x^2-2*y^2=1的基本解,顯然(3,2)為基本解,套用上述得到的通解公式,可以得到 xn,yn 的迭代公式:

x(n+1) = 3xn±4yn

y(n+1) = 2xn±3yn

#由於題目解要求為正整數且 x(n+1) 大於 xn,(1,1)為方程基本解,因此選擇乘積相加,而非相減。

x(n+1) = 3xn+4yn

y(n+1) = 2xn+3yn

**實現:

n = 54

def cal_probability2():

global n

x = 1

y = 1

n = 0

xy_list =

while (x + 1) / 2 <= n:

a = x

b = y

if x>y:

n += 1

x = 3 * a + 4 * b

y = 2 * a + 3 * b

print(n)

print(xy_list)

輸出結果為:

2

[(4, 3), (21, 15)]

案例二

數1,3,6,10,....構成數列,數1,4,9,16,....構成數列。將既是數列中的項,又是數列中的項按照從小到大的順序

構成新的數列,試寫出數列的前4項。

分析:

數列的通項公式是 a_n = n(n+1)/2,數列的通項公式是 b_n = n^2。要找出兩個數列中的公共項,可以讓兩個通項公式相等。此時,令 a_n = b_m,即 n(n+1)/2 = m**2,因為不確定 m 和 n 是否完全相同,因此分開來區別表示。

由 n(n+1)/2 = m**2 可得 (2n+1)**2-8*m^2 = 1,令 x = 2n+1,y = m,則方程變為:x^2 - 8*y^2 = 1,其中(3,1)為該方程的基本解。

**實現:

n = 4

n = 1

a = 3 #方程最小解(x1,y1)

b = 1

nm_list =

while n<=4:

x = a

y = b

a = 3*x+8*y

b = x+y*3

n += 1

print(nm_list)

result =

for w in nm_list:

b_n = w[1]**2

print(result)

輸出結果為:

[(1, 1), (8, 6), (49, 35), (288, 204)]

[1, 36, 1225, 41616]

後續會繼續更新相關知識點。

深入淺出學演算法008 求佩爾方程的解

4007 深入淺出學演算法008 求佩爾方程的解 time limit 1 sec memory limit 64 mb submit 3946 solved 1230 description 求關於x y的二次不定方程的解 x2 ny2 1 input 多組輸入資料,先輸入組數t 然後輸入正整數n...

貝塞爾例項

bezier and quadratic curves 1 quadraticcurveto cp1x,cp1y,x,y cpx,cpy表示控制點的座標,x,y表示終點座標 數學公式表示如下 二次方貝茲曲線的路徑由給定點p0 p1 p2的函式b t 追蹤 例項 1 doctype html 2 ht...

float例項講解

float是個強大的屬性,在實際前端開發過程中,人們經常拿它來進行布局,但有時,使用的不好,也麻煩多多啊。比如,現在我們要實現乙個兩列布局,左邊的列,寬度固定 右邊的列,寬度自動擴充套件。效果圖見下 思路 利用div float,div1為左邊的列,div2為右邊的列,將div1的寬度設定為固定寬度...