独舟星海 发表于 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先生有空时,试运行一下,看一看结果,及运行速度。

ysr 发表于 2021-10-17 15:19

今天有空给你试试,明天去住院,去钢板,固定骨折的钢板。

ysr 发表于 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

ysr 发表于 2021-10-17 16:13

独舟星海 发表于 2021-10-17 06:20
Option Explicit
Dim Ssb() As Long            '素数表,1亿以内素数表,一共5761455个
Dim ssbj As Long
...

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

ysr 发表于 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

ysr 发表于 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)

ysr 发表于 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个符合条件的素数。

ysr 发表于 2021-10-17 20:48

本帖最后由 ysr 于 2021-10-17 13:09 编辑

发一下运行结果的图片:

ysr 发表于 2021-10-17 21:12

超过传送容量了!分成两个图片来传,再传一个:
页: 1 2 3 [4] 5 6 7 8 9 10 11 12 13
查看完整版本: 《数论探秘》电子版