文字列としてのLongADD(文字列としてのs1、文字列としてのs2)
ただし、Excelシートのセルから関数(またはその組み合わせ)を直接呼び出すことができます。すべてが明確で理解しやすいものです。 そして、はい、自然数は文字列として渡されます。 VBAの最大文字列長は約2 31 = 2 147 483 648(私のLongPower関数(「2」、31)で計算)なので、さまざまなもので遊ぶのに十分です。
たとえば、Rivest、Shamir、およびAldemanによる画期的な記事からの2つの素数の乗算(最新の暗号化はすべてコード内にあります(コードでは、これらは定数RSA1、RSA2です))

カット-VBAコードの下で、マクロサポート(* .xlsmなど)を使用してExcelファイルのモジュールに単純に挿入できます。
PSは、素因数への分解の競合にコードを使用しようとはしません。 彼は20億桁の数字を理解していますが、そのようなタスクにはめちゃめちゃ遅いです。
あなたがまだ成功すればPPS、利益の10%-私に
PPPSいいえ、15%以上
' 2 ,
Public Const RSA1 = "3490529510847650949147849619903898133417764638493387843990820577"
Public Const RSA2 = "32769132993266709549961988190834461413177642967992942539798288533"
'
Public Function LongAdd(s1 As String, s2 As String) As String
'
Dim Carry As Byte, Digit1 As Byte, Digit2 As Byte
Dim Result As String
Carry = 0
Result = ""
'
If Len(s1) > Len(s2) Then
s2 = String(Len(s1) - Len(s2), "0") & s2
Else
s1 = String(Len(s2) - Len(s1), "0") & s1
End If
'
For i = Len(s1) To 1 Step -1
Digit1 = CByte(Mid(s1, i, 1))
Digit2 = CByte(Mid(s2, i, 1))
Result = ((Carry + Digit1 + Digit2) Mod 10) & Result
Carry = (Carry + Digit1 + Digit2) \ 10
Next
If Carry > 0 Then Result = Carry & Result
LongAdd = Result
End Function
'
Public Function LongMultiply(ByVal s1 As String, ByVal s2 As String) As String
Dim Result As String, s As String
Result = "0"
' ,
If Len(s1) < Len(s2) Then
s = s1
s1 = s2
s2 = s
End If
'
s2 = String(Len(s1) - Len(s2), "0") & s2
'
For i = Len(s2) To 1 Step -1
Result = LongAdd(Result, LongMultiplyDigit(s1, Mid(s2, i, 1)) & String(Len(s2) - i, "0"))
Next
LongMultiply = Result
End Function
'
Public Function LongMultiplyDigit(s1 As String, s2 As String) As String
'
Dim Carry As Byte, Digit1 As Byte, Digit2 As Byte
Dim Result As String
Carry = 0
Result = ""
Digit2 = CByte(Left(s2, 1))
If Digit2 = 0 Then
LongMultiplyDigit = "0"
Exit Function
End If
For i = Len(s1) To 1 Step -1
Digit1 = CByte(Mid(s1, i, 1))
Result = ((Carry + Digit1 * Digit2) Mod 10) & Result
Carry = (Carry + Digit1 * Digit2) \ 10
Next
If Carry > 0 Then Result = Carry & Result
LongMultiplyDigit = Result
End Function
'
Public Function LongSubstract(ByVal s1 As String, ByVal s2 As String) As String
'
Dim Carry As Byte, Digit1 As Byte, Digit2 As Byte
Dim Result As String
Carry = 0
Result = ""
If LongCompare(s1, s2) Then
For i = Len(s1) To 1 Step -1
Digit1 = CByte(Mid(s1, i, 1))
If i - (Len(s1) - Len(s2)) < 1 Then
Digit2 = 0
Else
Digit2 = Mid(s2, i - (Len(s1) - Len(s2)), 1)
End If
If Digit1 >= Digit2 + Carry Then
Result = CStr(Digit1 - Carry - Digit2) & Result
Carry = 0
Else
Result = CStr(10 + Digit1 - Carry - Digit2) & Result
Carry = 1
End If
Next
LongSubstract = LongTrim(Result)
Else
LongSubstract = "0"
End If
End Function
'
Public Function LongDivide(ByVal s1 As String, ByVal s2 As String) As String
' ,
Dim Dividend As String, Residue As String, Quotient As String, Digit As Byte
' ,
If Not LongCompare(s1, s2) Then
LongDivide = "0"
Exit Function
End If
Dividend = ""
Residue = s1
Quotient = ""
While Len(Residue) > 0
Dividend = LongTrim(Dividend & Left(Residue, 1))
Residue = Right(Residue, Len(Residue) - 1)
If LongCompare(Dividend, s2) Then
For Digit = 1 To 9
If Not LongCompare(Dividend, LongMultiplyDigit(s2, CStr(Digit))) Then Exit For
Next
Quotient = Quotient & CStr(Digit - 1)
Dividend = LongSubstract(Dividend, LongMultiplyDigit(s2, CStr(Digit - 1)))
Else
Quotient = Quotient & "0"
End If
Wend
LongDivide = LongTrim(Quotient)
End Function
' . 0! = 1
Public Function LongFactor(N As Long) As String
Dim Fact As String, i As Long
Fact = "1"
For i = 2 To N
Fact = LongMultiply(Fact, CStr(i))
Next
LongFactor = Fact
End Function
' .
' (), -
Public Function LongPower(s As String, p As Long) As String
Dim Power As String
Power = s
For i = 2 To p
Power = LongMultiply(Power, s)
Next
LongPower = Power
End Function
' -
' TRUE
Public Function LongCompare(s1 As String, s2 As String) As Boolean
If Len(s1) <> Len(s2) Then
LongCompare = (Len(s1) > Len(s2))
Else
For i = 1 To Len(s1)
If CByte(Mid(s1, i, 1)) <> CByte(Mid(s2, i, 1)) Then
LongCompare = CByte(Mid(s1, i, 1)) >= CByte(Mid(s2, i, 1))
Exit Function
Else
LongCompare = True
End If
Next
End If
End Function
' -
Function LongTrim(s As String) As String
Dim TrimString As String
TrimString = s
While (Left(TrimString, 1) = "0") And (Len(TrimString) > 1)
TrimString = Right(TrimString, Len(TrimString) - 1)
Wend
LongTrim = TrimString
End Function
'
Public Function GroupDigits(s As String) As String
Dim d As String
d = ""
While Len(s) > 0
d = " " & Right(s, 3) & d
s = Left(s, Len(s) - 3)
Wend
GroupDigits = d
End Function