📄 modoperation.bas
字号:
Public Function ArrADC(ByRef Num1() As Long, ByRef Num2() As Long) As Long() '加法
Dim Ans() As Long
Dim LNum1 As Long
Dim LNum2 As Long
Dim TNum1() As Long
Dim TNum2() As Long
Dim Result() As Long
Dim i As Long
Dim j As Long
Dim kk As Long
Dim IsN As Boolean
LNum1 = UBound(Num1)
LNum2 = UBound(Num2)
If LNum1 > LNum2 Then
i = LNum1
ReDim TNum2(i)
TNum1() = Num1
kk = LongToLong(Num2(), TNum2(), LNum2)
Else
i = LNum2
ReDim TNum1(i)
kk = LongToLong(Num1(), TNum1(), LNum1)
TNum2() = Num2
End If
ReDim Ans(i)
For j = 0 To i
Ans(j) = TNum1(j) + TNum2(j)
If IsN = True Then Ans(j) = Ans(j) + 1
If Ans(j) >= &H1000 Then
Ans(j) = Ans(j) - &H1000
IsN = True
Else
IsN = False
End If
Next
If IsN = True Then
ReDim Result(i + 1)
Result(i + 1) = 1
kk = LongToLong(Ans(), Result(), i)
Else
ReDim Result(i)
Result() = Ans
End If
ArrADC = Result
End Function
Public Function ArrSBB(ByRef Num1() As Long, ByRef Num2() As Long) As Long() '减法
Dim Ans() As Long
Dim LNum1 As Long
Dim LNum2 As Long
Dim TNum1() As Long
Dim TNum2() As Long
Dim Result() As Long
Dim i As Long
Dim j As Long
Dim kk As Long
Dim IsN As Boolean
LNum1 = UBound(Num1)
LNum2 = UBound(Num2)
If ArrMt(Num1(), Num2()) = True Then
i = LNum1
ReDim TNum2(i)
TNum1() = Num1
kk = LongToLong(Num2(), TNum2(), LNum2)
Else
i = LNum2
ReDim TNum2(i)
TNum1() = Num2
kk = LongToLong(Num1(), TNum2(), LNum1)
End If
ReDim Ans(i)
For j = 0 To i
Ans(j) = TNum1(j) - TNum2(j)
If IsN = True Then Ans(j) = Ans(j) - 1
If Ans(j) < 0 Then
Ans(j) = Ans(j) + &H1000
IsN = True
Else
IsN = False
End If
Next
i = UBound(Ans)
If i <> 0 Then
For j = i To 1 Step -1
If Ans(j) <> 0 Then Exit For
Next
Else
j = 0
End If
ReDim Result(j)
kk = LongToLong(Ans(), Result(), j)
ArrSBB = Result
End Function
Public Function ArrMUL(ByRef Num1() As Long, ByRef Num2() As Long) As Long() '乘法
Dim LNum1 As Long
Dim LNum2 As Long
Dim Tmp As Long
Dim Ans() As Long
Dim Result() As Long
Dim i As Long
Dim j As Long
LNum1 = UBound(Num1)
LNum2 = UBound(Num2)
Tmp = LNum1 + LNum2 + 1
ReDim Ans(Tmp)
For i = 0 To LNum1
For j = 0 To LNum2
Ans(i + j) = Ans(i + j) + Num1(i) * Num2(j)
If Ans(i + j) >= &H1000 Then
Ans(i + j + 1) = Ans(i + j + 1) + Int(Ans(i + j) / &H1000)
Ans(i + j) = Ans(i + j) Mod &H1000
End If
Next
Next
i = UBound(Ans)
If i <> 0 Then
For j = i To 1 Step -1
If Ans(j) <> 0 Then Exit For
Next
Else
j = 0
End If
ReDim Result(j)
i = LongToLong(Ans(), Result(), j)
ArrMUL = Result
End Function
Public Function ArrDIV(ByRef Num1() As Long, ByRef Num2() As Long, ModResult() As Long) As Long() '除法
Dim LNum1 As Long
Dim LNum2 As Long
Dim Ans() As Long
Dim TNum1() As Long
Dim Result() As Long
Dim i As Long
Dim kk As Long
Dim Tmp() As Long
Dim Tmp2() As Long
LNum2 = UBound(Num2)
ReDim Ans(0)
Ans(0) = 0
Do While kk = 0
TNum1() = ArrSBB(Num1(), ArrMUL(Ans(), Num2()))
If ArrMt(Num2(), TNum1()) Then Exit Do
LNum1 = UBound(TNum1)
ReDim Tmp(0)
Tmp(0) = Int(TNum1(LNum1) / (Num2(LNum2) + 1))
If Tmp(0) = 0 And LNum1 <> 0 Then
Tmp(0) = Int((TNum1(LNum1) * &H1000 + TNum1(LNum1 - 1)) / (Num2(LNum2) + 1))
LNum1 = LNum1 - 1
ElseIf Tmp(0) = 0 And LNum1 = 0 Then
Tmp(0) = Int(TNum1(LNum1) * &H1000 / (Num2(LNum2) + 1))
LNum1 = LNum1 - 1
End If
If LNum1 - LNum2 <> -1 Then
Tmp() = ArrShl(Tmp(), LNum1 - LNum2)
Else
Tmp(0) = 1
End If
Ans() = ArrADC(Ans(), Tmp())
Loop
LNum1 = UBound(Ans)
If LNum1 <> 0 Then
For i = LNum1 To 1 Step -1
If Ans(i) <> 0 Then Exit For
Next
Else
i = 0
End If
ReDim Result(i)
kk = LongToLong(Ans(), Result(), i)
ModResult() = TNum1
ArrDIV = Result
End Function
Public Function ArrShl(Num() As Long, n As Long) As Long() '左位移
Dim i As Long, Result() As Long
ReDim Result(UBound(Num) + n)
For i = 0 To UBound(Num)
Result(i + n) = Num(i)
Next i
ArrShl = Result
End Function
Public Function ArrShr(Num() As Long, n As Long) As Long() '右位移
Dim i As Long, Result() As Long
ReDim Result(UBound(Num) - n)
For i = 0 To UBound(Num)
Result(i - n) = Num(i)
Next i
ArrShr = Result
End Function
Public Function ArrMutMod(ByRef Num1() As Long, ByRef Num2() As Long, ByRef ModNum() As Long) As Long() '模乘
Dim Num() As Long
Dim Result() As Long
ArrDIV ArrMUL(Num1(), Num2()), ModNum(), Result()
ArrMutMod = Result
End Function
Public Function ArrMiMod(ByRef Num1() As Long, ByRef NumT() As Long, ByRef ModNum() As Long) As Long() '模幂
Dim Numb0() As Long
Dim Numb1() As Long
Dim Numb2() As Long
Dim e() As Long
Dim c() As Long
Dim d() As Long
Dim TmpNum() As Long
ReDim Numb0(0)
ReDim Numb1(0)
ReDim Numb2(0)
Numb0(0) = 0
Numb1(0) = 1
Numb2(0) = 2
e = NumT
c = Num1
ReDim d(0)
d(0) = 1
Do While ArrMt(e, Numb0)
If e(0) Mod 2 = 0 Then
c() = ArrMutMod(c(), c(), ModNum())
e = ArrDIV(e, Numb2, TmpNum())
Else
d() = ArrMutMod(d(), c(), ModNum())
e = ArrSBB(e, Numb1)
End If
Loop
ArrMiMod = d
End Function
Public Function LongToLong(ByRef Num1() As Long, Num2() As Long, ByVal L1 As Long) As Long
Dim i As Long
For i = 0 To L1
Num2(i) = Num1(i)
Next
End Function
Private Function ArrMt(ByRef Num1() As Long, Num2() As Long) As Boolean
Dim LNum1 As Long
Dim LNum2 As Long
Dim i As Long
LNum1 = UBound(Num1)
LNum2 = UBound(Num2)
If LNum1 > LNum2 Then
ArrMt = True
ElseIf LNum2 > LNum1 Then
ArrMt = False
Else
For i = LNum1 To 0 Step -1
If Num1(i) > Num2(i) Then
ArrMt = True
Exit For
ElseIf Num1(i) < Num2(i) Then
ArrMt = False
Exit For
End If
Next
End If
End Function
Private Function ArrIs0(ByRef Num1() As Long) As Boolean
If UBound(Num1) = 0 And Num1(0) = 0 Then
ArrIs0 = True
Else
ArrIs0 = False
End If
End Function
Public Function ArrDelSpace(Num() As Long) As Boolean
Dim i As Long, MaxArr As Long
For i = UBound(Num) To 0 Step -1
If Num(i) > &H0 Then
MaxArr = i
Exit For
End If
Next i
ReDim Preserve Num(MaxArr)
End Function
Public Function HexToArr(ByVal Str As String) As Long()
Dim LNum As Long
Dim i As Long
Dim Str2 As String
Dim ReStr() As Long
LNum = Len(Str) Mod 3
If LNum = 0 Then
Str2 = Str
Else
Str2 = String(3 - LNum, "0") & Str
End If
LNum = Len(Str2) / 3
ReDim ReStr(LNum - 1)
For i = 0 To LNum - 1
ReStr(i) = Val("&H" & Mid(Str2, LNum * 3 - i * 3 - 2, 3) & "&")
Next
HexToArr = ReStr()
End Function
Public Function ArrToHex(ByRef Num() As Long) As String
Dim LNum As Long
Dim i As Long
Dim s As String
Dim Ans As String
LNum = UBound(Num) - 1
For i = 0 To LNum
s = Hex(Num(i))
s = String(3 - Len(s), "0") & s
Ans = s & Ans
Next
Ans = Hex(Num(LNum + 1)) & Ans
ArrToHex = Ans
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -