⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.frm

📁 算法介绍 矩阵求逆在程序中很常见
💻 FRM
字号:
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Visual Basic - 简易的矩阵加密编码法(cipher)"
   ClientHeight    =   2730
   ClientLeft      =   1950
   ClientTop       =   1710
   ClientWidth     =   5280
   LinkTopic       =   "Form1"
   ScaleHeight     =   2730
   ScaleWidth      =   5280
   Begin VB.CommandButton Command2 
      Caption         =   "使用 3×3 矩阵来加密编码"
      Height          =   588
      Left            =   1392
      TabIndex        =   1
      Top             =   1392
      Width           =   2388
   End
   Begin VB.CommandButton Command1 
      Caption         =   "使用 2×2 矩阵来加密编码"
      Height          =   588
      Left            =   1416
      TabIndex        =   0
      Top             =   576
      Width           =   2388
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'1.程式名称:简易的矩阵加密编码法(cipher)
'2.开发日期:08/03/2005
'3.开发环境:Visual Basic 6.0 中文专业版 + SP3
'4.作者姓名:刘亮
'5.作者信箱:yjypm@eyou.com
Option Explicit

Private Sub Command1_Click()
     'M 是用来将字串 "编码" 的矩阵 ,可以任意指定矩阵中的元素, 但是必须是一个n×n的可逆方阵(invertible square matrix),这里只简单的以2×2的方阵来表示
     'iM 是用来将字串 "解码" 的矩阵, iM 是 M 的逆矩阵, 不可任意指定 iM 中的元素 , 因此 M 改变后 , 必须用逆矩阵的演算法求出 iM
     Dim want() As Double, i, strWant As String
     Dim M(1 To 2, 1 To 2) As Double, iM(1 To 2, 1 To 2) As Double
     M(1, 1) = 1: M(1, 2) = 2: M(2, 1) = 3: M(2, 2) = 4
     iM(1, 1) = -2: iM(1, 2) = 1: iM(2, 1) = 1.5: iM(2, 2) = -0.5
     Call encode("Visual Basic 实战网", M, want)
     For i = 1 To UBound(want)
          Debug.Print want(i);
     Next
     Call decode(strWant, iM, want)
     Debug.Print vbCrLf; strWant
End Sub

Public Sub encode(strSource As String, M() As Double, dblCoded() As Double)
     Dim i As Long, j As Long, n As Long, temp As Long, strM() As Double, strC() As Double
     n = UBound(M, 2)
     temp = Len(strSource) Mod n
     strSource = strSource & String(IIf(temp = 0, 0, n - temp), " ")
     ReDim strM(1 To n, 1 To 1) As Double, strC(1 To n, 1 To 1) As Double, dblCoded(1 To Len(strSource))
     For i = 1 To Len(strSource)
          If i Mod n = 0 Then
               strM(n, 1) = AscW(Mid(strSource, i, 1))
               Call MatrixMultiply(M, strM, strC)
               For j = 1 To n
                    dblCoded(i + j - n) = strC(j, 1)
               Next
          Else
               strM(i Mod n, 1) = AscW(Mid(strSource, i, 1))
          End If
     Next
End Sub

Public Sub decode(strSource As String, iM() As Double, dblCoded() As Double)
     Dim i As Long, j As Long, n As Long, strM() As Double, strC() As Double
     n = UBound(iM, 2)
     ReDim strM(1 To n, 1 To 1) As Double, strC(1 To n, 1 To 1) As Double
     For i = 1 To UBound(dblCoded, 1)
          If i Mod n = 0 Then
               strM(n, 1) = dblCoded(i)
               Call MatrixMultiply(iM, strM, strC)
               For j = 1 To n
                    strSource = strSource & ChrW(CLng(strC(j, 1)))
               Next
          Else
               strM(i Mod n, 1) = dblCoded(i)
          End If
     Next
End Sub

Public Sub MatrixMultiply(M() As Double, n() As Double, ReturnValue() As Double)
     Dim i As Long, j As Long, k As Long, row As Long, column As Long, max As Long
     row = UBound(M, 1)
     column = UBound(n, 2)
     max = UBound(M, 2)
     ReDim ReturnValue(1 To row, 1 To column)
     For i = 1 To row
          For j = 1 To column
               For k = 1 To max
                    ReturnValue(i, j) = ReturnValue(i, j) + M(i, k) * n(k, j)
               Next
          Next
     Next
End Sub

Private Sub Command2_Click()
     'M 是用来将字串 "编码" 的矩阵 ,可以任意指定矩阵中的元素, 但是必须是一个n×n的可逆方阵(invertible square matrix),这里只简单的以2×2的方阵来表示
     'iM 是用来将字串 "解码" 的矩阵, iM 是 M 的逆矩阵, 不可任意指定 iM 中的元素 , 因此 M 改变后 , 必须用逆矩阵的演算法求出 iM
     Dim want() As Double, i, strWant As String
     Dim M(1 To 3, 1 To 3) As Double, iM(1 To 3, 1 To 3) As Double
     M(1, 1) = 1: M(1, 2) = 2: M(1, 3) = 3: M(2, 1) = 4: M(2, 2) = 5
     M(2, 3) = 6: M(3, 1) = 7: M(3, 2) = 8: M(3, 3) = 10
     iM(1, 1) = -0.666666667: iM(1, 2) = -1.333333333: iM(1, 3) = 1
     iM(2, 1) = -0.666666667: iM(2, 2) = 3.666666667: iM(2, 3) = -2
     iM(3, 1) = 1: iM(3, 2) = -2: iM(3, 3) = 1
     Call encode("Visual Basic 实战网", M, want)
     For i = 1 To UBound(want)
          Debug.Print want(i);
     Next
     Call decode(strWant, iM, want)
     Debug.Print vbCrLf; strWant
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -