数学中国

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

RSA密码体制的原理和大素数的快速判断

[复制链接]
 楼主| 发表于 2021-4-19 05:59 | 显示全部楼层
验证一下(6666666666^7^k*18-1)/6517有多少是素数?
回复 支持 反对

使用道具 举报

发表于 2021-4-19 06:15 | 显示全部楼层
素数公式:(6666666666^7^k*18-1)/6517,(整数k>2),验证公式是否正确吗?
回复 支持 反对

使用道具 举报

发表于 2021-4-19 06:20 | 显示全部楼层
ysr 发表于 2021-4-19 05:59
验证一下(6666666666^7^k*18-1)/6517有多少是素数?

分解软件验证k=3,4,公式正确,k=5,数据太大了,分解软件没有给出答案
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-19 06:39 | 显示全部楼层
本帖最后由 ysr 于 2021-4-19 11:34 编辑
太阳 发表于 2021-4-18 22:20
分解软件验证k=3,4,公式正确,k=5,数据太大了,分解软件没有给出答案


验证结果,当k=3时,有:(刚才算错了,这回可能是对的)(该整数有3428位,判断结果为这是合数 (用时1.757813秒),被除数
179999993826000105575398799959630200343160841673290191907451013244405106377262270762316255460490787256341390933531954844477573145932610405822117794543437328726878564398414278706570209955934079809735989043496970260851461559202723502582059594785979169394578716802241094963399398138146210516535203925089286917289075030094734698980984878081538994085392273888801157367015631601448034259960631679963708744113349933844446184427374311752117804669861949363064825824737860212482776125780935957734065988104396815070979994358493333611553502319944286752009213997506393687991750065326077967890445530003886954908500082505475202648457751027833095405602620240017629219349502852995844064289628861981820824941308516541379810623624589376366425680492813791332459852125150673537279812606952976088419849150031612834530627070870844674479970387323061219690202643963431485496338189366647714493510192999219024968791012123718478175477216017681682423492721360304944642751194335929830663622715702667664056048853661518915139296550605006325466857394733225071281902150938497303567781464004651755426838379708095143991872337804554899754153398046465254168429123355003273157027671078923422768522373841948268575524841138130861715204143164843439777094129724970898036767473033891263406546375158044464364387355464075970416176842281569532262977093029967284466085891601842909089570803570014855860536747063527938577422123196711828454390232676219428407244787797639196917399514745775068188212915165336957663372388315826004604010333030066273597729339505579488570018887372630432708661507915077025101982169198524296659549026625285256893155753372287036440788150036348808660427321765565546567946719248014407272966252207355595368355004328759369435824677403573181178959419099356913826290477824782367516992833992884662376365032806081143657705721928974470830470579539808681107814592622708925822555332997779945020987115686563117682688716730696967838023679160347806312167951766194687947690114815710729318884673319824672214227492382849612520395752156303898569917606229438842600028479218750070292684926854981436071392135144919002784526297747153014335667170488337802793161690489384653686849988368220137618853870724544490826404875469510201415663167341511398085394974716784613005651326081643906542783076006943326872376663432642739313429239940337756803986189301514252407312240856966478327830378284388307359051330420773049381621154269259829373392531236444092959069573793275000833898330335632200251300022591035896207145668416021151492334676005404278635149013373276279593291348068791954096070336359121218431852389286715765207234048630588680967191640189223667947273670602951797387534590398882364603068291813419782751322807466096287295161450259885305859648659984118411940021330993760977759679875235939977714909525012820639205935973716447368285550752332391594613313236724623498284209808746212854795483119007509305114258171944303361385623965125067823289604845431549197905940962701269231695221520631437174694076304304347649469536664084722544040611073316907143121731566737003049377308741628963871953727827612759950159525786313267318590780451630648805863562231755604293963416354687279930994091226482496976199156350477294832794047945400195156134482096140572778691806510754853044728050284923166865286759332693079132073976270780150804489801539898102934739031292435449145176478014055153154933014749633251700133554040111593434499667634685460809067407158327099297996567700120004037999894424600000061739999999981

这回程序慢了,改成快速的就错了?再改一下试试吧!
回复 支持 反对

使用道具 举报

发表于 2021-4-19 07:44 | 显示全部楼层
ysr 发表于 2021-4-19 07:38
k=5时,该整数有63位,为这是合数(用时1.953125E-03秒),被除数
27870613066568127404545416001658704397 ...

k=7,8,9,10,11,可以分解整数吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-19 07:49 | 显示全部楼层
太阳 发表于 2021-4-18 23:44
k=7,8,9,10,11,可以分解整数吗?

这回算的太小了,可能都不对了,太大的不好算,时间长,再修改一下吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-19 09:23 | 显示全部楼层
本帖最后由 ysr 于 2021-4-19 12:51 编辑

程序错了,修改了一下,传一下这个订正后的程序代码:

Private Function zhengchuqyushu(sa As String) As String
If InStr(sa, "/") = 0 Then
zhengchuqyushu = 0
Else
zhengchuqyushu = Mid(sa, InStr(sa, "/") + 1)
End If


End Function


Private Function zhengchuqy(sa As String) As String
If InStr(sa, "/") = 0 Then
zhengchuqy = sa
Else
zhengchuqy = Left(sa, InStr(sa, "/") - 1)
End If


End Function


Public Function MBBC(D1 As String) As String 'kai pingfang
If Len(D1) < 10 Then
jss = Int(Sqr(D1))
JW = Val(D1) - (jss) ^ 2
  If JW = 0 Then
  MBBC = jss
  Else
  MBBC = jss & "/" & JW
    End If
Else
Dim X 'shuju changdu
X = Len(D1) \ 4
D2 = String(4 - Len(D1) + 4 * X, "0") & D1
Dim A() As String
ReDim A(4 To 4 * X + 4)
Dim B() As String
ReDim B(2 To 2 * X)
Dim I, J, js
  For I = 4 To 4 * X + 4 Step 4
  
A(I) = Mid(D2, I - 3, 4)
js = Int(Sqr(Val(A(4) & A(8))))
JW = Val(A(4) & A(8)) - (js) ^ 2
Next
   J = 4
   Do While J <= 2 * X
   
   jws = MPC1(JW & "0000", A(2 * J + 4))
   If MBJC(Trim(jws), MbC(Trim(js), 200)) <= 0 Then
    B(J) = "00"
    Else
    jwc = Left(jws, Len(jws) - Len(MbC(Trim(js), 200)) + 2) \ Left(MbC(Trim(js), 200), 2)
    If Len(jwc) > 2 Then
     B(J) = 99
     Else
     B(J) = jwc
     End If
   
     
     Do While MBJC(Trim(jws), MbC(MPC1(B(J), MbC(Trim(js), 200)), B(J))) = -1
     
     B(J) = B(J) - 1
     
               Loop
          End If
          JW = MPC(Trim(jws), MbC(MPC1(MbC(200, Trim(js)), B(J)), B(J)))
      
     js = MPC1(MbC(Trim(js), 100), Trim(B(J)))
     
      
   J = J + 2
   If JW = 0 Then
      
   MBBC = js
   Else
   MBBC = js & "/" & JW
   End If
   Loop
   
End If
End Function

Public Function MBJC(D1 As String, D2 As String) As String ';bijiao
If Len(D1) <= 10 And Len(D2) <= 10 Then
If Val(D1) > Val(D2) Then
MBJC = 1
Else
If Val(D1) = Val(D2) Then
MBJC = 0
Else
MBJC = -1
End If
End If
Else

If Len(D1) > Len(D2) Then
MBJC = 1
Else
If Len(D1) < Len(D2) Then
MBJC = -1
Else
If Len(D1) = Len(D2) Then
Dim X, Y
X = Len(D1) \ 4: Y = Len(D2) \ 4
Dim A() As String, B() As String
ReDim A(4 To 4 * X + 4)
ReDim B(4 To 4 * Y + 4)
If Val(Left(D1, Len(D1) - 4 * X)) > Val(Left(D2, Len(D2) - 4 * Y)) Then
  MBJC = 1
  Else
  If Val(Left(D1, Len(D1) - 4 * X)) < Val(Left(D2, Len(D2) - 4 * Y)) Then
  MBJC = -1
  Else
  For I = 4 To 4 * X Step 4
  A(I) = Mid(D1, Len(D1) - I + 1, 4)
  B(I) = Mid(D2, Len(D2) - I + 1, 4)
  Next
  J = 4 * X
  Do While A(J) = B(J) And J >= 8
  
  J = J - 4
     Loop
     
     
   If Val(A(J)) - Val(B(J)) > 0 Then
   MBJC = 1
   Else
   If Val(A(J)) - Val(B(J)) < 0 Then
   MBJC = -1
   Else
   MBJC = 0
   End If
   
  End If
  
  
  
End If
End If
End If
End If
End If
End If
End Function

Public Function MCC(D1 As String, D2 As String) As String ';除数少于8位的除法
If Len(D1) < Len(D2) Then
   MCC = "0" & "/" & D1
   Else
   If Len(D1) < 9 Then
    MCC = Val(D1) \ Val(D2) & "/" & Val(D1) - (Val(D1) \ Val(D2)) * Val(D2)
     If Mid(MCC, InStr(MCC, "/") + 1) = 0 Then
  MCC = Left(MCC, InStr(MCC, "/") - 1)
Else
MCC = MCC
End If
   
    Else
   
   Dim X ';fen duan changdu
   X = Len(D1)
   
     
   
     Dim A() As String
      ReDim A(1 To X)  ';定义数组的储存空间
      For I = 1 To X Step 1  ';把被除数各位放在a()中
       A(I) = Mid(D1, I, 1)
        
      
       Next I
      Dim B() As String
      JW = 0
     ReDim B(1 To X)
     For J = 1 To X Step 1
    B(J) = Val(JW & A(J)) \ Val(D2)
      JW = Val(JW & A(J)) - Val(B(J)) * Val(D2)
       Next J
       For r = 1 To X
       If JW = 0 Then
          MCC = MCC & B(r)
          Else
          CJ = CJ & B(r)
          MCC = CJ & "/" & JW
      
    End If
   
    For I = 1 To Len(MCC)
   If Not Mid(MCC, I, 1) = "0" Then
       Exit For
   End If
Next
strTmp = Mid(MCC, I)
If Len(strTmp) = 0 Then
MCC = "0"
Else
MCC = strTmp
End If
   
   Next
   
   End If
     
     End If
   
End Function

Public Function MCC1(D1 As String, D2 As String) As String ';大整数的除法
Dim ss
ss = MBJC(D1, D2)
If ss = -1 Then
MCC1 = "0" & "/" & D1
  Else
  If ss = 0 Then
   MCC1 = 1
   Else
   If Len(D1) = Len(D2) Then
     s = Val(Left(D1, 1)) \ Val(Left(D2, 1))

Do While MBJC(MbC(Trim(s), Trim(D2)), D1) = 1
  s = s - 1
  Loop
  If MBJC(MbC(Trim(s), Trim(D2)), D1) = 0 Then
   MCC1 = s
   Else
   MCC1 = s & "/" & MPC(Trim(D1), MbC(Trim(s), Trim(D2)))

End If
    Else
    If Len(D2) < 9 Then
     MCC1 = MCC(D1, D2)
     Else
    Dim X, Y ';定义分段长度
    X = Len(D1): Y = Len(D2)
   
Dim JW, jcc, jss, jcs

  Dim A() As String, B() As String
  
  ReDim A(1 To X)
  ReDim B(1 To Y)
  For I = 1 To X
  A(I) = Mid(D1, I, 1)
  Next
  For J = 1 To Y
  B(J) = Mid(D2, J, 1)
  Next
  jcc = Val(A(1) & A(2)) \ Val(B(1) & B(2))
   
      
        
  jss = MbC(Trim(jcc), D2)
   For i1 = 1 To Y
    jws = jws & A(i1)
      Next
      
      Do While MBJC(Trim(jws), Trim(jss)) = -1
      jcc = jcc - 1
      jss = MbC(Trim(jcc), D2)
      Loop
  JW = MPC(Trim(jws), Trim(jss))
  
    z = X - Y
   
    Dim c() As String
    ReDim c(1 To z)
    For s = 1 To z
     If MBJC(JW & A(s + Y), D2) = -1 Then
       c(s) = "0"
       Else
     jwc = Val(Left(JW & A(s + Y), 3)) \ Val(Left(D2, 2))
      If Len(jwc) > 1 Then
      c(s) = "9"
       Else
        c(s) = jwc
         End If
      
     Do While MBJC(JW & A(s + Y), MbC(Val(c(s)), D2)) = -1
    c(s) = Right(10000 + Val(c(s) - 1), 1)
     Loop
     End If
   
     JW = MPC(JW & A(s + Y), MbC(Val(c(s)), D2))
     
    jcc = jcc & c(s)
    Next s
    If JW = 0 Then
    MCC1 = jcc
    Else
    MCC1 = jcc & "/" & JW
    End If
   
  For I = 1 To Len(MCC1)
    If Not Mid(MCC1, I, 1) = "0" Then
        Exit For
    End If
Next
strTmp = Mid(MCC1, I)
  If Len(strTmp) = 0 Then
  MCC1 = "0"
  Else
MCC1 = strTmp
End If
   
   
   
    End If
   
   
   
   
   
  
  End If
End If
End If
End Function
Public Function MbC(D1 As String, D2 As String) As String
Dim j1&, j2&, e&, d&, e1&, m, n

   ' 按列法计算C=A*B
m = Trim(D1): n = Trim(D2)
X = Len(m) \ 4: Y = Len(n) \ 4
m = String(4 * X + 4 - Len(m), "0") & m
n = String(4 * Y + 4 - Len(n), "0") & n
X = X + 1: Y = Y + 1
Dim A(), B()
ReDim A(1 To X): ReDim B(1 To Y)
For i1 = 1 To X
A(i1) = Val(Mid(m, i1 * 4 - 3, 4))
Next
For i2 = 1 To Y
B(i2) = Val(Mid(n, i2 * 4 - 3, 4))
Next
ma = X: mb = Y
    MC = ma + mb
    ReDim c(MC)
    e1 = 0
    j1 = ma: j2 = ma
    For I = MC To 2 Step -1
        If I <= ma Then j2 = I - 1
        e = e1: e1 = 0
        For J = j1 To j2
            e = e + A(J) * B(I - J)
            If e > 2040000000 Then '减少进位次数
                e = e - 2040000000
                e1 = e1 + 204000
            End If
        Next J

        If j1 > 1 Then j1 = j1 - 1
base = 10000
        d = e \ base
        c(I) = e - d * base
        If Len(c(I)) < 4 Then
        c(I) = String(4 - Len(c(I)), "0") & c(I)
        Else
        c(I) = c(I)
        End If
jc = c(I) & jc
        e1 = e1 + d
    Next I
    jc = d & jc
   MbC = qqdl(Trim(jc))
End Function

'该程序已经做了修改,不是去掉前导0的问题,是补够前导0的问题。


Public Function MPC(D1 As String, D2 As String) As String ';jianfaqi
  Dim X, Y ';两数长度
  If qqdl(D2) = "0" Then
  MPC = D1
  Else
If Len(D1) >= Len(D2) Then
  D4 = String(Len(D1) - Len(D2), "0") & D2
  D3 = D1
  Else
  D4 = D2
  D3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  X = Len(D3) \ 8: Y = Len(D4) \ 8
  D3 = String(8 * X + 8 - Len(D3), "0") & D3
  D4 = String(8 * Y + 8 - Len(D4), "0") & D4
  X = X + 1: Y = Y + 1
  
  Dim A() As String, B1() As String, C1() As String, e1() As String
  ReDim A(1 To X)
  ReDim B1(1 To Y)
  ReDim C1(1 To X)
  ReDim e1(1 To X)
  Dim I, J, C2, CJ, JW
  For J = Y To 1 Step -1 ';D2
  JW = 1 ';yu jie weichuzhi
  B1(J) = Mid(D4, J * 8 - 7, 8) ';每位数
For I = X To 1 Step -1  ';D1
     A(I) = Mid(D3, I * 8 - 7, 8) ';每位数
   C1(I) = Val(1 & A(I)) - Val(B1(I)) - Val(1) + Val(JW) ';计算jia
   If Len(C1(I)) <= 8 Then
   JW = 0
   C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
   Else
     JW = Left(C1(I), Len(C1(I)) - 8)
     End If
     e1(I) = Right(C1(I), 8)
     If Len(e1(I)) < 8 Then
     e1(I) = String(8 - Len(e1(I)), "0") & e1(I)
     Else
     e1(I) = e1(I)
     End If
     
    Next
    Next
    For r = 1 To X
    MPC = MPC & e1(r)
    If Len(MPC) > Len(D1) Then
    MPC = Mid(MPC, Len(MPC) - Len(D1) + 1)
    Else
    MPC = MPC
    End If
    For I = 1 To Len(MPC)
      If Not Mid(MPC, I, 1) = "0" Then
          Exit For
      End If
  Next
  strTmp = Mid(MPC, I)
    If Len(strTmp) = 0 Then
    MPC = "0"
    Else
  MPC = strTmp
  End If
    Next
   End If
   
  End Function

Public Function MPC1(D1 As String, D2 As String) As String 'jiafa
  Dim X, Y, JW '两数长度

If Len(D1) >= Len(D2) Then
  D4 = String(Len(D1) - Len(D2), "0") & D2
  D3 = D1
  Else
  D4 = D2
  D3 = String(Len(D2) - Len(D1), "0") & D1
  End If
  X = Len(D3) \ 8: Y = Len(D4) \ 8
  If 8 * X < Len(D3) Then
  D3 = String(8 * X + 8 - Len(D3), "0") & D3
  D4 = String(8 * Y + 8 - Len(D4), "0") & D4
  X = X + 1: Y = Y + 1
  Else
  X = X: Y = Y
  D3 = D3: D4 = D4
  End If
  Dim A() As String, B1() As String, C1() As String, e1() As String
  ReDim A(1 To X)
  ReDim B1(1 To Y)
  ReDim C1(1 To X)
  ReDim e1(1 To X)
  Dim I, J, C2, CJ
  For J = Y To 1 Step -1 'D2
  JW = 0 '进位清0
  B1(J) = Mid$(D4, J * 8 - 7, 8) '每位数
For I = X To 1 Step -1  'D1
     A(I) = Mid$(D3, I * 8 - 7, 8) '每位数
   C1(I) = Val(A(I)) + Val(B1(I)) + Val(JW) '计算jia
   If Len(C1(I)) < 8 Then
   C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
   Else
   C1(I) = C1(I)
   End If
     JW = Left(C1(I), Len(C1(I)) - 8)
     e1(I) = Right(C1(I), 8)
    Next
    Next
    For r = 1 To X
    If JW = 0 Then
    MPC1 = MPC1 & e1(r)
    Else
    jc = jc & e1(r)
    MPC1 = JW & jc
    End If
    Next
   MPC1 = qqdl(Trim(MPC1))
  End Function
  
  Private Function qqdl(sa As String) As String

  
  For I = 1 To Len(sa)
    If Not Mid(sa, I, 1) = "0" Then
        Exit For
    End If
Next
strTmp = Mid(sa, I)
  If Len(strTmp) = 0 Then
  qqdl = "0"
  Else
qqdl = strTmp
End If
End Function


Private Function zzxc(sa As String, sb As String) As String
Dim A, B, c, d, r
  A = Trim(sa)
  B = Trim(sb)
  If Len(A) < 10 And Len(B) < 10 Then
  
  If Val(A) > Val(B) Then
     c = A
     d = B
  Else
     c = B
     d = A
  End If
Do Until Val(c) Mod Val(d) = 0
     r = c Mod d
     c = d
     d = r
  Loop
  
  Else
  
  If MBJC(Trim(A), Trim(B)) >= 1 Then
  c = A
  d = B
  Else
  c = B
  d = A
  End If
  Do Until zhengchuqyushu(MCC1(Trim(c), Trim(d))) = 0
  r = zhengchuqyushu(MCC1(Trim(c), Trim(d)))
  c = d
  d = r
  Loop
  End If

  
  zzxc = d
  
End Function

Private Function qniyuan(sa As String, sb As String) As String
Dim n, p, A, B, c, d, r
  n = Trim(sa)
  p = Trim(sb)
  A = 1
  B = 0
  c = 0
  d = 1
  If Len(n) < 10 And Len(p) < 10 Then
  
  If Val(n) > Val(p) Then
     m = n
     q = p
     s1 = 1
  Else
     m = p
     q = n
     s1 = 0
  End If
Do Until Val(m) Mod Val(q) = 0
    s = m \ q
     r = m Mod q
     s1 = s1 + 1
     If s1 Mod 2 = 1 Then
     A = A
     B = A * s + B
     c = c
     d = c * s + d
     Else
     B = B
     A = A + B * s
     d = d
     c = c + d * s
     End If
     m = q
     q = r
  Loop
  If Val(A + B * m) = p Then
  B = B
  A = A + B * (m - 1)
  d = d
  c = c + d * (m - 1)
  Else
  If Val(B + A * m) = p Then
  A = A
  B = B + A * m
  c = c
  d = d + c * m
  Else
  B = B
  A = A + B * (m - 1)
  d = d
  c = c + d * (m - 1)
  End If
  End If
X = (A + B) Mod p
  Y = (c + d) Mod n
  
  
  Else
  
  If MBJC(Trim(n), Trim(p)) >= 1 Then
  m = n
  q = p
  s1 = 1
  Else
  m = p
  q = n
  s1 = 0
  End If
  Do Until zhengchuqyushu(MCC1(Trim(m), Trim(q))) = 0
  s = zhengchuqy(MCC1(Trim(m), Trim(q)))
  r = zhengchuqyushu(MCC1(Trim(m), Trim(q)))
  s1 = s1 + 1
  If s1 Mod 2 = 1 Then
  A = A
  B = MPC1(MbC(Trim(A), Trim(s)), Trim(B))
  c = c
  d = MPC1(MbC(Trim(c), Trim(s)), Trim(d))
  Else
  B = B
  A = MPC1(Trim(A), MbC(Trim(B), Trim(s)))
  d = d
  c = MPC1(Trim(c), MbC(Trim(d), Trim(s)))
  End If
  
  m = q
  q = r
  Loop
  
  If MPC1(Trim(A), MbC(Trim(B), Trim(m))) = p Then
  B = B
  A = MPC1(Trim(A), MbC(Trim(B), MPC(Trim(m), 1)))
  d = d
  c = MPC1(Trim(c), MbC(Trim(d), MPC(Trim(m), 1)))
  Else
  If MPC1(Trim(B), MbC(Trim(A), Trim(m))) = p Then
  A = A
  B = MPC1(Trim(B), MbC(Trim(A), Trim(m)))
  c = c
  d = MPC1(Trim(d), MbC(Trim(c), Trim(m)))
  Else
  B = B
  A = MPC1(Trim(A), MbC(Trim(B), MPC(Trim(m), 1)))
  d = d
  c = MPC1(Trim(c), MbC(Trim(d), MPC(Trim(m), 1)))
  End If
  End If
Do While Left(A, 1) = "0"
    A = Mid(A, 2)
Loop
  
  End If
  
  qniyuan = A
End Function

Private Function qksmimo(sa As String, sb As String, sc As String) As String
Dim c, e, n, d
c = Trim(sa)
e = Trim(sb)
n = Trim(sc)
d = 1
If Len(c) < 5 And Len(e) < 5 And Len(n) < 5 Then
c = Val(c): n = Val(n)
Do While e > 0
If Right(e, 1) Mod 2 = 0 Then
c = c * c Mod n
e = e / 2

Else
d = d * c Mod n
e = e - 1
End If
Loop
Else
c = c
Do While MBJC(Trim(e), 1) >= 0
If Right(e, 1) Mod 2 = 0 Then
c = zhengchuqyushu(MCC1(MbC(Trim(c), Trim(c)), Trim(n)))
e = zhengchuqy(MCC1(Trim(e), 2))
Else
d = zhengchuqyushu(MCC1(MbC(Trim(c), Trim(d)), Trim(n)))
e = MPC(Trim(e), 1)
End If
Loop
End If

qksmimo = d
End Function

Private Function fenjieyinzi(sa As String) As String
Dim X, A, B
X = sa
B = Int(Sqr(Val(X)) / 2)
If X = 3 Or X = 2 Then
A = True
Else
If X Mod 2 = 0 Then
A = False
Else

For I = 3 To 2 * B + 1 Step 2
If X Mod I = 0 Then
A = False
Exit For

Else: A = True

End If
Next
End If
End If
If A = True Then
fenjieyinzi = "这是个素数"
Else
fenjieyinzi = "2*2"
End If

End Function


Private Sub Command1_Click() '判断素数的程序
Dim A, B, k
k = Val(Text1)
ts = Timer
A = ksm2(Val(7), Val(k)): B = ksm2("9999999999", Trim(A))
s = MbC(Trim(B), Val(18)): s2 = MPC(Trim(s), Val(1))
s1 = zhengchuqy(MCC1(Trim(s2), Val(6517)))
t1 = fenjieyinzi0(Trim(s1))
If InStr(t1, "*") = 0 Then
t = "这是素数"
Else
t = "这是合数"
End If
Text2 = s2
Combo1 = "该整数有" & Len(s1) & "位,判断结果为" & t & " (用时" & Timer - ts & "秒),被除数" & vbCrLf & Text2

End Sub

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

Combo1 = ""
Form1.Cls
End Sub

Private Function fenjieyinzi0(sa As String) As String
Dim A, n
n = Trim(sa)
If Len(n) < 6 Then
fenjieyinzi0 = fenjieyinzi(Trim(n))
Else
n1 = MPC(Trim(n), 1)
A = 123
'a为明文
a1 = zzxc(Trim(n), Trim(A))
If Val(a1) > 1 Then
fenjieyinzi0 = a1 & "*"
Else
c = 999
'c为公约
Do While zzxc(Trim(n1), Trim(c)) > 1
c = Val(c - 1)
Loop
d = qniyuan(Trim(c), Trim(n1))
'd为逆元为私钥
a2 = qksmimo(Trim(A), Trim(c), Trim(n))
'a2为密文
a3 = qksmimo(Trim(a2), Trim(d), Trim(n))
If MBJC(Trim(a3), Trim(A)) = 0 Then
fenjieyinzi0 = "这是素数有"
Else
fenjieyinzi0 = "2*2"
End If
End If
End If


End Function

Private Function ksm2(sb As String, sa As String) As String '2的快速幂程序
Dim A, B
A = Trim(sb): B = sa
If B = 1 Then
ksm2 = A
ElseIf B = 0 Then
ksm2 = 1
Else
a1 = A
Do While B > 1
s = Int(Log(B) / Log(2))
s1 = 0
Do While s1 < s
A = MbC(Trim(A), Trim(A))
s1 = s1 + 1
Loop
a2 = A
B = B - 2 ^ s
A = a1
If s2 > 0 Then
a3 = MbC(Trim(a3), Trim(a2))
Else
a3 = a2
End If
s2 = s2 + 1
Loop
If B = 1 Then
ksm2 = MbC(Trim(a3), Trim(a1))
Else
ksm2 = a3
End If
s3 = Len(ksm2)
ksm2 = ksm2
End If


End Function
回复 支持 反对

使用道具 举报

发表于 2021-4-21 15:48 | 显示全部楼层
ysr 发表于 2021-4-19 06:39
验证结果,当k=3时,有:(刚才算错了,这回可能是对的)(该整数有3428位,判断结果为这是合数 (用时1 ...

k=3,数据错误的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-21 21:24 | 显示全部楼层
太阳 发表于 2021-4-21 07:48
k=3,数据错误的

你的公式,分子不能被分母整除,这是取整数部分,按规定的计算超乘方的方法计算的,这是调整了几次的最后结果,最符合公式的理论结果,如果你认为数据是错的只好你自己算吧,毕竟公式是你自己的本意自己最清楚。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 08:19 , Processed in 0.093750 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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