数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: ysr

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

[复制链接]
 楼主| 发表于 2025-4-26 19:46 | 显示全部楼层
计算标准佩尔方程x^2-Dy^2=1的最小解的python程序
while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        d=c**0.5
        a0=int(d)
        a1=a0
        r=d
        p0=a0
        q0=1
        r=1/(r-a1)
        a1=int(r)
        p1=a0*a1+1
        q1=a1
        s=2
        while int(1/(r-a1))!=2*a0 :
            s+=1
            r=1/(r-a1)
            a1=int(r)
            p2=a1*p1+p0
            q2=a1*q1+q0
            p0=p1
            q0=q1
            p1=p2
            q1=q2
        if s % 2 == 0 :
            x0=p1
            y0=q1
        else :
            x0=2*p1*p1+1
            y0=2*p1*q1
        print(x0,y0)
    except:exit()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-26 19:54 | 显示全部楼层
输入5741,输出:
循环节长度 2645 循环节  75/1/3/2/1/37/5/5/37/1/2/4/14/1/11/1/4/3/11/26/1/1/1/7/11/1/2/19/1/2/……………………
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-28 19:18 | 显示全部楼层
本帖最后由 ysr 于 2025-5-6 06:08 编辑

Private Sub Command1_Click()
Dim x, Y
x = Trim(Text1)
Y = Trim(Text2)
z = Val(Text4)
x = Replace(Trim(x), " ", "")
Y = Replace(Trim(Y), " ", "")
A = MbC(Trim(x), Trim(x))
B = MbC(Trim(Y), Trim(Y))
B = MbC(Trim(B), Val(z))
If MBJC(Trim(A), Trim(B)) >= 0 Then
c = MPC(Trim(A), Trim(B))
Else
c = "-" & MPC(Trim(B), Trim(A))
End If


Text3 = "左边=" & c

End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""
Text4 = ""
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-28 23:27 | 显示全部楼层
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 = MPC1(MbC(Val(a1), Trim(p1)), Trim(p0))
  Print p2
q2 = MPC1(MbC(Val(a1), Trim(q1)), Trim(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=" & MPC1(MbC(2, MbC(Trim(p1), Trim(p1))), 1) & " y0=" & MbC(2, MbC(Trim(p1), Trim(q1))) & " 循环节长度:" & Val(s1)
End If

End Sub

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

使用道具 举报

 楼主| 发表于 2025-5-2 16:42 | 显示全部楼层
本帖最后由 ysr 于 2025-5-6 07:06 编辑

#计算标准佩尔方程x^2-Dy^2=1的最小解的python程序
while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        c=c*10**200
        d=c**0.5
        d=int(d)
        d=str(d)
        a0=int(d[:len(d)-100])
        a1=a0
        r=d
        p0=a0
        q0=1
        r=10**200/int(r[len(r)-100:])
        r=int(r)
        r=str(r)
        a1=int(r[:len(r)-100])
        p1=a0*a1+1
        q1=a1
        s=1
        while int(r[:len(r)-100])!=2*a0 :
            s+=1
            r=10**200/int(r[len(r)-100:])
            r=int(r)
            r=str(r)
            a1=int(r[:len(r)-100])
            p2=a1*p1+p0
            q2=a1*q1+q0
            p0=p1
            q0=q1
            p1=p2
            q1=q2
        if s % 2 == 0 :
            x0=p0
            y0=q0
        else :
            x0=2*p0*p0+1
            y0=2*p0*q0
        print(x0,y0)
        print("循环节长度",s)
    except:exit()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-5 07:10 | 显示全部楼层
#计算标准佩尔方程x^2-Dy^2=1的最小解的python程序
while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        d=c**0.5
        a0=int(d)
        a1=a0
        r=d
        p0=a0
        q0=1
        r=1/(r-a1)
        a1=int(r)
        p1=a0*a1+1
        q1=a1
        s=2
        while int(1/(r-a1))!=2*a0 :
            s+=1
            r=1/(r-a1)
            a1=int(r)
            p2=a1*p1+p0
            q2=a1*q1+q0
            p0=p1
            q0=q1
            p1=p2
            q1=q2
        if s % 2 == 0 :
            x0=p1
            y0=q1
        else :
            x0=2*p1*p1+1
            y0=2*p1*q1
        print(x0,y0)
        print("循环节长度",s)
    except:exit()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-5 07:30 | 显示全部楼层
本帖最后由 ysr 于 2025-5-6 02:37 编辑

while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        c=c*10**40
        d=c**0.5
        d=int(d)
        d=str(d)
        a0=int(d[:len(d)-20])
        a1=a0
        r=d
        p0=a0
        q0=1
        r=10**40/int(r[len(r)-20:])
        r=int(r)
        a1=int(r/10**20)
        r=str(r)
        p1=a0*a1+1
        q1=a1
        s=1
        while int(r[:len(r)-20])!=2*a0 :
            s+=1
            r=10**40/int(r[len(r)-20:])
            r=int(r)
            a1=int(r/10**20)
            r=str(r)
            p2=a1*p1+p0
            q2=a1*q1+q0
            p0=p1
            q0=q1
            p1=p2
            q1=q2
        if s % 2 == 0 :
            x0=p0
            y0=q0
        else :
            x0=2*p0*p0+1
            y0=2*p0*q0
        print(x0,y0)
        print("循环节长度",s)
    except:exit()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-8 09:58 | 显示全部楼层
while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        c=c*10**40
        d=c**0.5
        d=int(d)
        d=str(d)
        a0=int(d[:len(d)-20])
        a1=a0
        r=d
        r=10**40/int(r[len(r)-20:])
        r=int(r)
        a1=int(r/10**20)
        r=str(r)
        print(a0,a1)
        s=1
        while int(r[:len(r)-20])!=2*a0 :
            s+=1
            r=10**40/int(r[len(r)-20:])
            r=int(r)
            a1=int(r/10**20)
            r=str(r)
            print(a1,end=' ')
        print("循环节长度",s)
    except:exit()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-8 10:18 | 显示全部楼层
while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        c=c*10**200
        d=c**0.5
        d=int(d)
        d=str(d)
        a0=int(d[:len(d)-100])
        a1=a0
        r=d
        r=10**200/int(r[len(r)-100:])
        r=int(r)
        a1=int(r/10**100)
        r=str(r)
        print(a0,a1)
        s=1
        while int(r[:len(r)-100])!=2*a0 :
            s+=1
            r=10**200/int(r[len(r)-100:])
            r=int(r)
            a1=int(r/10**100)
            r=str(r)
            print(a1,end=' ')
        print("循环节长度",s)
    except:exit()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-11 07:01 | 显示全部楼层
本帖最后由 ysr 于 2025-5-14 21:56 编辑

while True:
    try:
        a = 1
        b = 0
        c = input('请输入一个数字:')
        c = eval(c)
        for i in range(c):
            y=abs(i*i+1)/6497
            y=y**0.5
            if int(y)==y:
                if y<c and i*i-6497*y*y==-1:
                        print("x=",i,"y=",y)
    except:exit()
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 05:43 , Processed in 0.083906 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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