数学中国

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

高手编的快速计算16(1.6×10^9)亿内孪生素数的程序

[复制链接]
发表于 2025-6-27 15:30 | 显示全部楼层 |阅读模式
本帖最后由 ysr 于 2025-6-27 12:01 编辑

Dim pri(200000000) As Byte

Sub 按钮1_Click()
  pritab
End Sub

Sub pritab()
  '用字节位筛法生成16亿以内的素数表
  Dim i As Long, j As Long, b(8) As Byte, c As Byte, k As Long, l As Long, t As Double
  j = 1
  t = Timer
  For i = 0 To 7
    b(i) = j
    j = j * 2       '位运算值初始化
  Next
  For i = 0 To 200000000
    pri(i) = 170    '先假设所有奇数都是素数
  Next
  pri(0) = 172      '0,1不是素数,2是素数
  i = 3
  While i * i <= 1600000000
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      j = i * i
      While j <= 1600000000
        If (pri(Int(j / 8)) And b(j Mod 8)) > 0 Then
          c = b(j Mod 8) Xor 255
          pri(Int(j / 8)) = pri(Int(j / 8)) And c
        End If
        j = j + i * 2
      Wend
    End If
    i = i + 2
  Wend
  k = 0
  j = 0
  For i = 2 To 1600000000
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      If i - l = 2 Then j = j + 1
      k = k + 1
      l = i
    End If
  Next
  MsgBox "总素数:" & k & ",最大素数:" & l & ",孪生素数对:" & j & ",用时:" & Timer - t & "秒"
End Sub
 楼主| 发表于 2025-6-27 16:13 | 显示全部楼层
如下为程序结果:

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-27 16:28 | 显示全部楼层
改进一下球10001*10001=100020001内的:

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-27 16:44 | 显示全部楼层
本帖最后由 ysr 于 2025-6-27 12:06 编辑

改进一下求9999*9999=99980001内的:


99980001与100020001之间的孪生素数对的个数是:440397-440241=156.

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-27 16:48 | 显示全部楼层
Dim pri(200000000) As Byte

Sub 按钮1_Click()
  pritab
End Sub

Sub pritab()
  '用字节位筛法生成16亿以内的素数表
  Dim i As Long, j As Long, b(8) As Byte, c As Byte, k As Long, l As Long, t As Double
  j = 1
  t = Timer
  For i = 0 To 7
    b(i) = j
    j = j * 2       '位运算值初始化
  Next
  For i = 0 To 99980001
    pri(i) = 170    '先假设所有奇数都是素数
  Next
  pri(0) = 172      '0,1不是素数,2是素数
  i = 3
  While i * i <= 99980001
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      j = i * i
      While j <= 99980001
        If (pri(Int(j / 8)) And b(j Mod 8)) > 0 Then
          c = b(j Mod 8) Xor 255
          pri(Int(j / 8)) = pri(Int(j / 8)) And c
        End If
        j = j + i * 2
      Wend
    End If
    i = i + 2
  Wend
  k = 0
  j = 0
  For i = 2 To 99980001
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      If i - l = 2 Then j = j + 1
      k = k + 1
      l = i
    End If
  Next
  MsgBox "总素数:" & k & ",最大素数:" & l & ",孪生素数对:" & j & ",用时:" & Timer - t & "秒"
End Sub


回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-27 19:27 | 显示全部楼层
Dim pri(200000000) As Byte

Sub 按钮1_Click()
  pritab
End Sub

Sub pritab()
  '用字节位筛法生成16亿以内的素数表
  Dim i As Long, j As Long, b(8) As Byte, c As Byte, k As Long, l As Long, t As Double
  j = 1
  t = Timer
  For i = 0 To 7
    b(i) = j
    j = j * 2       '位运算值初始化
  Next
  For i = 0 To 100
    pri(i) = 170    '先假设所有奇数都是素数
  Next
  pri(0) = 172      '0,1不是素数,2是素数
  i = 3
  While i * i <= 100
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      j = i * i
      While j <= 100
        If (pri(Int(j / 8)) And b(j Mod 8)) > 0 Then
          c = b(j Mod 8) Xor 255
          pri(Int(j / 8)) = pri(Int(j / 8)) And c
        End If
        j = j + i * 2
      Wend
    End If
    i = i + 2
  Wend
  k = 0
  j = 0
  For i = 2 To 100
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      If i - l = 2 Then j = j + 1: Print l; i
      k = k + 1
      l = i
    End If
  Next
  MsgBox "总素数:" & k & ",最大素数:" & l & ",孪生素数对:" & j & ",用时:" & Timer - t & "秒"
End Sub


回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-27 19:43 | 显示全部楼层
9999*9999=99980001与10001*10001=100020001之间又156对孪生素数:
99980171   99980173
99981071   99981073
99981179   99981181
99981227   99981229
99981521   99981523
99981599   99981601
99982241   99982243
99982247   99982249
99982367   99982369
99982901   99982903
99983309   99983311
99983759   99983761
99983969   99983971
99984119   99984121
99985157   99985159
99985217   99985219
99985271   99985273
99985337   99985339
99985547   99985549
99985661   99985663
99986351   99986353
99986477   99986479
99986609   99986611
99986849   99986851
99987131   99987133
99987269   99987271
99987299   99987301
99987779   99987781
99987869   99987871
99987959   99987961
99988487   99988489
99988571   99988573
99988829   99988831
99989081   99989083
99989177   99989179
99989567   99989569
99990491   99990493
99990587   99990589
99990971   99990973
99991271   99991273
99991517   99991519
99991559   99991561
99992309   99992311
99992447   99992449
99992771   99992773
99992939   99992941
99993161   99993163
99993329   99993331
99993461   99993463
99994229   99994231
99995039   99995041
99995111   99995113
99995279   99995281
99995549   99995551
99995669   99995671
99995891   99995893
99996077   99996079
99996131   99996133
99996179   99996181
99996509   99996511
99997067   99997069
99997127   99997129
99997187   99997189
99997367   99997369
99997871   99997873
99998447   99998449
99998609   99998611
99999077   99999079
99999257   99999259
99999437   99999439
99999539   99999541
99999587   99999589
100000037   100000039
100000469   100000471
100000541   100000543
100000799   100000801
100000937   100000939
100001651   100001653
100001687   100001689
100001819   100001821
100001927   100001929
100002011   100002013
100002167   100002169
100002569   100002571
100002611   100002613
100002671   100002673
100002941   100002943
100003151   100003153
100003619   100003621
100003829   100003831
100004027   100004029
100004141   100004143
100004501   100004503
100004519   100004521
100004549   100004551
100004561   100004563
100004831   100004833
100005317   100005319
100005461   100005463
100005467   100005469
100006211   100006213
100006547   100006549
100006607   100006609
100006637   100006639
100006757   100006759
100006769   100006771
100006787   100006789
100007099   100007101
100007177   100007179
100007231   100007233
100007351   100007353
100007909   100007911
100007987   100007989
100008317   100008319
100008869   100008871
100009361   100009363
100009499   100009501
100010021   100010023
100010177   100010179
100010189   100010191
100010327   100010329
100010549   100010551
100011029   100011031
100011089   100011091
100011449   100011451
100011467   100011469
100011869   100011871
100012607   100012609
100012667   100012669
100013759   100013761
100013987   100013989
100014287   100014289
100014389   100014391
100015427   100015429
100015757   100015759
100016129   100016131
100016381   100016383
100016417   100016419
100016597   100016599
100016771   100016773
100017077   100017079
100017557   100017559
100017569   100017571
100017761   100017763
100017791   100017793
100018001   100018003
100018409   100018411
100018619   100018621
100018691   100018693
100018799   100018801
100018811   100018813
100019501   100019503
100019657   100019659
100019681   100019683
100019837   100019839
100019921   100019923
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-27 19:46 | 显示全部楼层
Dim pri(200000000) As Byte

Sub 按钮1_Click()
  pritab
End Sub

Sub pritab()
  '用字节位筛法生成16亿以内的素数表
  Dim i As Long, j As Long, b(8) As Byte, c As Byte, k As Long, l As Long, t As Double
  j = 1
  t = Timer
  For i = 0 To 7
    b(i) = j
    j = j * 2       '位运算值初始化
  Next
  For i = 0 To 100020001
    pri(i) = 170    '先假设所有奇数都是素数
  Next
  pri(0) = 172      '0,1不是素数,2是素数
  i = 3
  While i * i <= 100020001
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      j = i * i
      While j <= 100020001
        If (pri(Int(j / 8)) And b(j Mod 8)) > 0 Then
          c = b(j Mod 8) Xor 255
          pri(Int(j / 8)) = pri(Int(j / 8)) And c
        End If
        j = j + i * 2
      Wend
    End If
    i = i + 2
  Wend
  k = 0
  j = 0
  For i = 2 To 100020001
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      If i - l = 2 And i >= 99980001 Then j = j + 1: Text1 = Text1 & l & "   " & i & vbCrLf
      k = k + 1
      l = i
    End If
  Next
  MsgBox "总素数:" & k & ",最大素数:" & l & ",99980001与100020001的孪生素数对:" & j & ",用时:" & Timer - t & "秒"
End Sub


回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-27 19:53 | 显示全部楼层
求1000内的素数河孪生素数个数的程序:
Dim pri(200000000) As Byte

Sub 按钮1_Click()
  pritab
End Sub

Sub pritab()
  '用字节位筛法生成16亿以内的素数表
  Dim i As Long, j As Long, b(8) As Byte, c As Byte, k As Long, l As Long, t As Double
  j = 1
  t = Timer
  For i = 0 To 7
    b(i) = j
    j = j * 2       '位运算值初始化
  Next
  For i = 0 To 1000
    pri(i) = 170    '先假设所有奇数都是素数
  Next
  pri(0) = 172      '0,1不是素数,2是素数
  i = 3
  While i * i <= 1000
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      j = i * i
      While j <= 1000
        If (pri(Int(j / 8)) And b(j Mod 8)) > 0 Then
          c = b(j Mod 8) Xor 255
          pri(Int(j / 8)) = pri(Int(j / 8)) And c
        End If
        j = j + i * 2
      Wend
    End If
    i = i + 2
  Wend
  k = 0
  j = 0
  For i = 2 To 1000
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      If i - l = 2 Then j = j + 1: Print l; i
      k = k + 1
      l = i
    End If
  Next
  MsgBox "总素数:" & k & ",最大素数:" & l & ",孪生素数对:" & j - 1 & ",用时:" & Timer - t & "秒"
End Sub

回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-27 19:55 | 显示全部楼层
程序运行结果如下图:

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 02:58 , Processed in 0.095892 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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