数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 124|回复: 13

计算标准佩尔方程x^2-Dy^2=1的最小解的vb程序

[复制链接]
发表于 2025-4-4 21:14 | 显示全部楼层 |阅读模式
代码如下:

Private Sub Command1_Click()
'计算标准佩尔方程x^2-Dy^2=1的最小解,D的数值不能太大
Dim d, a0, r
d = Val(Text1)
a0 = Int(Sqr(d))
a1 = a0
r = Sqr(d)
p0 = a0
q0 = 1
r = 1 / (r - a1)
a1 = Int(r)
p1 = a0 * a1 + 1
q1 = a1
s1 = 1
If a1 = 2 * a0 Then
p2 = p1: q2 = q1
Else

Do While Int(1 / (r - a1)) <> 2 * a0
s1 = s1 + 1
r = 1 / (r - a1)
a1 = Int(r)
  p2 = a1 * p1 + p0
q2 = a1 * q1 + q0

p0 = p1: q0 = q1
p1 = p2: q1 = q2

Loop
End If

If Val(s1 + 1) Mod 2 = 0 Then
Text2 = "最小解为: x0=" & p1 & " y0=" & q1
Else
Text2 = "最小解为: x0=" & 2 * p1 * p1 + 1 & " y0=" & 2 * p1 * q1
End If

End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""

End Sub
 楼主| 发表于 2025-4-4 21:24 | 显示全部楼层
D的值小于等于1001,否则就溢出了!D的值必须为非平方数:
例如:输入D=997,输出:最小解为: x0=14418057673 y0=456624468
输入D=1001,输出:最小解为: x0=1060905 y0=33532
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-4 23:18 | 显示全部楼层
Private Sub Command1_Click()
'计算标准佩尔方程x^2-Dy^2=1的最小解,D的数值不能太大
Dim d, a0, r
d = Val(Text1)
a0 = Int(Sqr(d))
a1 = a0
r = Sqr(d)
p0 = a0
q0 = 1
r = 1 / (r - a1)
a1 = Int(r)
p1 = a0 * a1 + 1
q1 = a1
s1 = 1
If a1 = 2 * a0 Then
p1 = p0: q1 = q0
Else
s1 = 2
Do While Int(1 / (r - a1)) <> 2 * a0
s1 = s1 + 1
r = 1 / (r - a1)
a1 = Int(r)
  p2 = a1 * p1 + p0
q2 = a1 * q1 + q0

p0 = p1: q0 = q1
p1 = p2: q1 = q2

Loop
End If

If Val(s1) Mod 2 = 0 Then
Text2 = "最小解为: x0=" & p1 & " y0=" & q1 & " 循环节长度:" & Val(s1)
Else
Text2 = "最小解为: x0=" & 2 * p1 * p1 + 1 & " y0=" & 2 * p1 * q1 & " 循环节长度:" & Val(s1)
End If

End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""

End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-4 23:23 | 显示全部楼层
输入45,输出:最小解为: x0=161 y0=24 循环节长度:6
输入97,输出:最小解为: x0=62809633 y0=6377352 循环节长度:11
输入997,输出:最小解为: x0=14418057673 y0=456624468 循环节长度:13
输入1001,输出:最小解为: x0=1060905 y0=33532 循环节长度:14
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-7 02:04 | 显示全部楼层
Private Sub Command1_Click()
'计算标准佩尔方程x^2-Dy^2=1的最小解,D的数值不能太大
Dim d, a0, r
d = Val(Text1)
Print Date
Print Time
a0 = Int(Sqr(d))
a1 = a0
r = Sqr(d)
p0 = a0
q0 = 1
r = 1 / (r - a1)
a1 = Int(r)
p1 = a0 * a1 + 1
q1 = a1
s1 = 1
If a1 = 2 * a0 Then
p1 = p0: q1 = q0
Else
s1 = 2
Do While Int(1 / (r - a1)) <> 2 * a0
s1 = s1 + 1
r = 1 / (r - a1)
a1 = Int(r)
  p2 = a1 * p1 + p0
  Print p2
q2 = a1 * q1 + q0

p0 = p1: q0 = q1
p1 = p2: q1 = q2

Loop
End If

If Val(s1) Mod 2 = 0 Then
Text2 = "最小解为: x0=" & p1 & " y0=" & q1 & " 循环节长度:" & Val(s1)
Else
Text2 = "最小解为: x0=" & 2 * p1 * p1 + 1 & " y0=" & 2 * p1 * q1 & " 循环节长度:" & Val(s1)
End If

End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Me.Cls
End Sub

回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-18 19:05 | 显示全部楼层
输入:151,输出:最小解为: x0=6.12629850491674E+189 y0=4.98551101828825E+188 循环节长度:197
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-18 19:09 | 显示全部楼层
输入157,输出:最小解为: x0=46698728731849 y0=3726964292220 循环节长度:17
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-18 19:11 | 显示全部楼层
Private Sub Command1_Click()
'计算标准佩尔方程x^2-Dy^2=1的最小解,D的数值不能太大
Dim d, a0, r
d = Val(Text1)
Print Date
Print Time
a0 = Int(Sqr(d))
a1 = a0
r = Sqr(d)
p0 = a0
q0 = 1
Print p0
r = 1 / (r - a1)
a1 = Int(r)
p1 = a0 * a1 + 1
q1 = a1
s1 = 1
Print p1
If a1 = 2 * a0 Then
p1 = p0: q1 = q0
Else
s1 = 2
Do While Int(1 / (r - a1)) <> 2 * a0
s1 = s1 + 1
r = 1 / (r - a1)
a1 = Int(r)
  p2 = a1 * p1 + p0
  Print p2
q2 = a1 * q1 + q0

p0 = p1: q0 = q1
p1 = p2: q1 = q2

Loop
End If

If Val(s1) Mod 2 = 0 Then
Text2 = "最小解为: x0=" & p1 & " y0=" & q1 & " 循环节长度:" & Val(s1)
Else
Text2 = "最小解为: x0=" & 2 * p1 * p1 + 1 & " y0=" & 2 * p1 * q1 & " 循环节长度:" & Val(s1)
End If

End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Me.Cls
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-18 23:25 | 显示全部楼层
输入817,输出:最小解为: x0=343 y0=12 循环节长度:6
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-18 23:30 | 显示全部楼层
输入474,输出:最小解为: x0=193549 y0=8890 循环节长度:14
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-4-30 17:01 , Processed in 0.108689 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表