数学中国

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

《数论探秘》电子版

  [复制链接]
发表于 2021-10-17 14:14 | 显示全部楼层
编写一个程序求Q(奇数)减2的n次方其值没有素数的奇数
猜想每一个奇数(大于等于5的)都可以表示成一个素数+2^n形式,编写一个vb6程序,寻找一亿内的反例。例如1048573这个数,它小于2^20=1048576,也就是1048573-2^n这个式子中的n可以从1取到19,在这19次取值中,其结果假设没有素数,则次数是一个反例,其中有一次是素数,就不是反例,程序设计中,也可以考虑,当为真时,跳出循环,执行下一个奇数。最好先制作素数表,或许也不快,不如直接判断,比起判断一个数是否为素数要容易的多(是指运算时间上)。大概就这么个意思,有不清楚的地方,在商榷。
回复 支持 反对

使用道具 举报

发表于 2021-10-17 14:20 | 显示全部楼层
Option Explicit
Dim Ssb() As Long            '素数表,1亿以内素数表,一共5761455个
Dim ssbj As Long
Dim b2b(30) As Long         '2的倍数表,long 范围最大只能容纳 2^31,但最后一个数用不了,会超范围

Const 范围 As Long = 10000  '1亿以内,我光生成素数表就用了超过4分钟。你要测试1亿,直接把这1万改成1亿吧

Private Sub Command1_Click()
Dim i As Long, j As Long, o As Long, t As Long
Dim fly As Boolean, flj As Long, fl() As Long

flj = 0
ReDim fl(flj)

Call 日志("开始生成素数表")
Call 生成素数表

Call 日志("开始生成2的倍数表")
Call 生成倍数表

Call 日志("开始计算....")

For i = 5 To 范围 Step 2
    j = 1
    fly = False             '假设不符合
    Do While i > Ssb(j)
        t = i - Ssb(j)
        For o = 0 To 30         '这里会浪费循环次数,不管了
            If t = b2b(o) Then
                fly = True      '找到符合
                Exit For        '不再查找
            End If
        Next o
        If fly Then Exit Do     '找到符合不再查找
        j = j + 1
    Loop
    If Not fly Then             '如果都没找到
        flj = flj + 1           '保存结果
        ReDim Preserve fl(flj)
        fl(flj) = i
        Call 日志("找到第 " & flj & " 个: " & i)        '显示结果,注意 日志过程中有 DoEvents 命令,会拖慢运算速度
    End If
Next i

Call 日志("完成查找,共找到 " & flj & " 个。")

End Sub

Private Sub 生成倍数表()
'如果有倍数表,则不再生成
If b2b(30) > 0 Then Exit Sub

Dim i As Long
For i = 0 To 30
    b2b(i) = 2 ^ i
Next i
End Sub

Private Sub 生成素数表()
'如果已经有素数表,则不再生成
If ssbj > 3 Then Exit Sub

Dim i As Long, j As Long, t As Long
Dim sy As Boolean

'素数从2开始,需要指定
ssbj = 1
ReDim Ssb(ssbj)
Ssb(1) = 2

For i = 3 To 范围 Step 2
    sy = True
    t = Sqr(i)
    For j = 3 To ssbj
        If t < Ssb(j) Then Exit For
        If i Mod Ssb(j) = 0 Then
            sy = False
            Exit For
        End If
    Next j
    If sy Then
        ssbj = ssbj + 1
        ReDim Preserve Ssb(ssbj)
        Ssb(ssbj) = i
    End If
Next i
End Sub

Private Sub 日志(cs As String)
    With List1
        If .ListCount >= 100 Then
            .RemoveItem 0
        End If
        .AddItem Now & " " & cs
        DoEvents
    End With
End Sub
这是在vb6中,风吹过b给编写的代码,解决奇数=一个素数+2^n的反例问题。
ysr先生有空时,试运行一下,看一看结果,及运行速度。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 15:19 | 显示全部楼层
今天有空给你试试,明天去住院,去钢板,固定骨折的钢板。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 15:40 | 显示全部楼层
Private Sub 日志(cs As String)
    With List1‘(试验显示list1变量未定义,无法运行,再学习一下)
        If .ListCount >= 100 Then
            .RemoveItem 0
        End If
        .AddItem Now & " " & cs
        DoEvents
    End With
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 16:13 | 显示全部楼层
独舟星海 发表于 2021-10-17 06:20
Option Explicit
Dim Ssb() As Long            '素数表,1亿以内素数表,一共5761455个
Dim ssbj As Long
...

试验了几次,无法运行,经过修改也不行,我也不精通编程语言,还需要学习。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 16:18 | 显示全部楼层
Private Sub 生成素数表()
'如果已经有素数表,则不再生成
If ssbj > 3 Then Exit Sub

Dim i As Long, j As Long, t As Long
Dim sy As Boolean

'素数从2开始,需要指定
ssbj = 1
ReDim Ssb(ssbj)
Ssb(1) = 2

For i = 3 To 范围 Step 2
    sy = True
    t = Sqr(i)
    For j = 3 To ssbj
        If t < Ssb(j) Then Exit For
        If i Mod Ssb(j) = 0 Then
            sy = False
            Exit For
        End If
    Next j
    If sy Then
        ssbj = ssbj + 1
        ReDim Preserve Ssb(ssbj)
        Ssb(ssbj) = i
        ja = " " & i '增加一条
    End If
Next i
End Sub

Private Sub 日志(cs As String)
Dim s$, i%, j, ja
Dim list1
s = Mid(ja, 2) '修改的部分
j = Split(s)
For i = 0 To UBound(j)
list1.AddItem j(i)
Next
    With list1
        If .ListCount >= 100 Then
            .RemoveItem 0
        End If
        .AddItem Now & " " & cs
        DoEvents
    End With
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 16:49 | 显示全部楼层
本帖最后由 ysr 于 2021-10-17 09:30 编辑

Option Explicit
Dim Ssb() As Long            '素数表,1亿以内素数表,一共5761455个
Dim ssbj As Long
Dim b2b(30) As Long         '2的倍数表,long 范围最大只能容纳 2^31,但最后一个数用不了,会超范围

Const 范围 As Long = 10000  '1亿以内,我光生成素数表就用了超过4分钟。你要测试1亿,直接把这1万改成1亿吧

Private Sub Command1_Click()
Dim i As Long, j As Long, o As Long, t As Long, ja
Dim fly As Boolean, flj As Long, fl() As Long

flj = 0
ReDim fl(flj)

Call 日志("开始生成素数表")
Call 生成素数表

Call 日志("开始生成2的倍数表")
Call 生成倍数表

Call 日志("开始计算....")

For i = 5 To 范围 Step 2
    j = 1
    fly = False             '假设不符合
    Do While i > Ssb(j)
        t = i - Ssb(j)
        For o = 0 To 30         '这里会浪费循环次数,不管了
            If t = b2b(o) Then
                fly = True      '找到符合
                Exit For        '不再查找
            End If
        Next o
        If fly Then Exit Do     '找到符合不再查找
        j = j + 1
    Loop
    If Not fly Then             '如果都没找到
        flj = flj + 1           '保存结果
        ReDim Preserve fl(flj)
        fl(flj) = i
        Call 日志("找到第 " & flj & " 个: " & i)        '显示结果,注意 日志过程中有 DoEvents 命令,会拖慢运算速度
    End If
Next i

Call 日志("完成查找,共找到 " & flj & " 个。")
Text1 = flj
End Sub

Private Sub 生成倍数表()
'如果有倍数表,则不再生成
If b2b(30) > 0 Then Exit Sub

Dim i As Long
For i = 0 To 30
    b2b(i) = 2 ^ i
Next i
End Sub

Private Sub 生成素数表()
'如果已经有素数表,则不再生成
If ssbj > 3 Then Exit Sub

Dim i As Long, j As Long, t As Long, ja
Dim sy As Boolean

'素数从2开始,需要指定
ssbj = 1
ReDim Ssb(ssbj)
Ssb(1) = 2

For i = 3 To 范围 Step 2
    sy = True
    t = Sqr(i)
    For j = 3 To ssbj
        If t < Ssb(j) Then Exit For
        If i Mod Ssb(j) = 0 Then
            sy = False
            Exit For
        End If
    Next j
    If sy Then
        ssbj = ssbj + 1
        ReDim Preserve Ssb(ssbj)
        Ssb(ssbj) = i
         ja = " " & i '增加一条
    End If
Next i
End Sub

Private Sub 日志(cs As String)
Dim s$, i%, j, ja
Dim list1
s = Mid(ja, 2) '修改的部分
j = Split(s)
For i = 0 To UBound(j)
list1.AddItem j(i)
cs = " " & j(i)
Next
   
End Sub

改成这样后结果是:Text1=26.(可能是不对,这样程序可以运行了,当输出改为Text1=i时,Text1=10001)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 20:40 | 显示全部楼层
Option Explicit
Dim Ssb() As Long            '素数表,1亿以内素数表,一共5761455个
Dim ssbj As Long
Dim b2b(30) As Long         '2的倍数表,long 范围最大只能容纳 2^31,但最后一个数用不了,会超范围

Const 范围 As Long = 10000  '1亿以内,我光生成素数表就用了超过4分钟。你要测试1亿,直接把这1万改成1亿吧

Private Sub Command1_Click()
Dim i As Long, j As Long, o As Long, t As Long, ja
Dim fly As Boolean, flj As Long, fl() As Long

flj = 0
ReDim fl(flj)

Call 日志("开始生成素数表")
Call 生成素数表

Call 日志("开始生成2的倍数表")
Call 生成倍数表

Call 日志("开始计算....")

For i = 5 To 范围 Step 2
    j = 1
    fly = False             '假设不符合
    Do While i > Ssb(j)
        t = i - Ssb(j)
        For o = 0 To 30         '这里会浪费循环次数,不管了
            If t = b2b(o) Then
                fly = True      '找到符合
                Exit For        '不再查找
            End If
        Next o
        If fly Then Exit Do     '找到符合不再查找
        j = j + 1
    Loop
    If Not fly Then             '如果都没找到
        flj = flj + 1           '保存结果
        ReDim Preserve fl(flj)
        fl(flj) = i
        Call 日志("找到第 " & flj & " 个: " & i)        '显示结果,注意 日志过程中有 DoEvents 命令,会拖慢运算速度
    End If
Next i

Call 日志("完成查找,共找到 " & flj & " 个。")
Text1 = flj
Combo1 = List1.ListCount
End Sub

Private Sub 生成倍数表()
'如果有倍数表,则不再生成
If b2b(30) > 0 Then Exit Sub

Dim i As Long
For i = 0 To 30
    b2b(i) = 2 ^ i
Next i
End Sub

Private Sub 生成素数表()
'如果已经有素数表,则不再生成
If ssbj > 3 Then Exit Sub

Dim i As Long, j As Long, t As Long, ja
Dim sy As Boolean

'素数从2开始,需要指定
ssbj = 1
ReDim Ssb(ssbj)
Ssb(1) = 2

For i = 3 To 范围 Step 2
    sy = True
    t = Sqr(i)
    For j = 3 To ssbj
        If t < Ssb(j) Then Exit For
        If i Mod Ssb(j) = 0 Then
            sy = False
            Exit For
        End If
    Next j
    If sy Then
        ssbj = ssbj + 1
        ReDim Preserve Ssb(ssbj)
        Ssb(ssbj) = i
         ja = " " & i '增加一条
    End If
Next i
End Sub

Private Sub 日志(cs As String)
    With List1
        If .ListCount >= 100 Then
            .RemoveItem 0
        End If
        .AddItem Now & " " & cs
        DoEvents
    End With
End Sub

'加了控件list1就可以运行了,结果是找到26个符合条件的素数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 20:48 | 显示全部楼层
本帖最后由 ysr 于 2021-10-17 13:09 编辑

发一下运行结果的图片:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 21:12 | 显示全部楼层
超过传送容量了!分成两个图片来传,再传一个:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

点评

ysr先生辛苦了!。能正常运行,输出结果就可以了。这个问题用vfp也容易解决。我是为了学习vb6特发的此贴。由于时间有限,还没有好好学习vb6。那个网站独木星空是我。  发表于 2021-10-17 21:21
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 05:27 , Processed in 0.060547 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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