【應用密碼學】實驗四 公鑰密碼1——數學基礎

一、實驗要求與目的

學習快速模冪運算、擴展歐幾里得、中國剩余定理的算法思想以及代碼實現。

二、實驗內容與步驟記錄(只記錄關鍵步驟與結果,可截圖,但注意排版與圖片大小)

1.快速模冪運算的設計思路

快速模冪運算的核心思想是利用二進制表示和平方乘法來減少乘法運算的次數。具體步驟如下:將指數 b 表示為二進制形式。例如,b=13 的二進制表示為 1101。

?

通過這種表示,可以將冪運算分解為若干次平方和乘法。

從最低位開始逐位處理指數的二進制表示:如果當前位是 1,將當前的 a 乘到結果中。不管當前位是 0 還是 1,都將 a 平方(即 a=a^2modm),并右移一位(相當于除以 2)。在每一步中,都對結果和中間值取模 m,以避免數值過大導致溢出。使用一個循環來處理指數的每一位。循環條件是 b>0,每次循環都將 b 右移一位,直到 b 為 0。

2.擴展歐幾里得算法的設計思路:

擴展歐幾里得算法是基于經典的歐幾里得算法(輾轉相除法)進行擴展的。歐幾里得算法用于計算兩個整數 a 和 b 的最大公約數(gcd(a,b)),其核心思想是利用遞歸關系: gcd(a,b)=gcd(b,a mod b) 直到 a mod b=0,此時 b 即為最大公約數。目標是找到整數 x 和 y,使得: ax+by=gcd(a,b) 這實際上是將最大公約數表示為 a 和 b 的線性組合。算法通過遞歸的方式逐步求解 x 和 y。

假設已知: gcd(b,a mod b)=b?x1?+(a modb)?y1?。根據歐幾里得算法的遞歸關系,可以推導出:gcd(a,b)=gcd(b,a mod b)。因此: ax+by=b?x1?+(a mod b)?y1?。進一步展開 a mod b=a?b??b/a??,可以得到: ax+by=b?x1?+(a?b??b/a??)?y1?,整理后得到: x=y1? y=x1???b/a???y1。當 a=0 時,遞歸終止,此時: gcd(0,b)=b 對應的線性組合為: 0?x+b?y=b 因此,x=0,y=1。

通過遞歸調用擴展歐幾里得算法,逐步求解 x 和 y,直到找到滿足 ax+by=gcd(a,b) 的整數解。如果 gcd(a,b)=1,則找到了滿足 ax+by=1 的解。結果如下圖:

3.中國剩余定理設計思路:

首先計算所有模數(除數)的乘積 M,即 M=∏i?divisor[i]。這是中國剩余定理的關鍵基礎,因為最終的解將在這個范圍內。

對于每個同余方程 x≡remainder[i]?(mod?divisor[i]),計算 Mi?=M/divisor[i],即 M 除以當前模數的商。然后使用 gmpy2.invert 求 Mi? 在模 divisor[i] 下的逆元 k。根據中國剩余定理的構造方法,將每個同余方程的解表示為 remainder[i]×k×Mi?,并將所有這些項相加,得到一個可能的解 n。

最終的解 n 可能大于 M,因此通過 nmodM 取最小非負解 nmin?。返回 nmin?,即滿足所有同余方程的最小非負整數解。

三、源代碼記錄

快速模冪運算

def fast_modular_exponentiation(a, b, m):result = 1 base = a % m  while b > 0:if b % 2 == 1:  result = (result * base) % mbase = (base * base) % m  # 將 base 平方并模 mb //= 2  # 將指數 b 右移一位(相當于除以 2)return resulta = 3
b = 13
m = 17
result = fast_modular_exponentiation(a, b, m)
print(f"{a}^{b} mod {m} = {result}")

擴展歐幾里得算法

def extended_gcd(a, b):if a == 0:return (0, 1, b)else:x1, y1, gcd = extended_gcd(b % a, a)x = y1 - (b // a) * x1y = x1return (x, y, gcd)# 用戶手動輸入 a 和 b
a = int(input("請輸入整數a: "))
b = int(input("請輸入整數b: "))# 使用函數求解 ax + by = gcd(a, b)
x, y, gcd = extended_gcd(a, b)if gcd == 1:print(f"找到 x = {x}, y = {y} 使得 {a}x + {b}y = 1")
else:print(f"沒有整數解,因為 gcd({a}, {b}) = {gcd} 不等于 1")

中國剩余定理

import gmpy2
divisor=[3,5,7]
remainder=[2,3,2]def CRT(divisor, remainder):mul = 1for d in divisor:mul *= d  # 計算除數列中所有元素的乘積n = 0for i in range(len(divisor)):k = gmpy2.invert(mul // divisor[i], divisor[i])n += remainder[i] * k * (mul // divisor[i])n_min = n % mulreturn n_min# 調用函數并打印結果
result = CRT(divisor, remainder)
print("The smallest solution is:", result)

四、實驗思考

求兩個數的最大公因數是否還有其他算法?

答:更相減損術是一種古老的求最大公因數的方法,其核心思想是通過反復相減來逐步減小兩個數的大小,直到它們相等,此時的值即為最大公因數。具體操作是:每次用較大的數減去較小的數,然后用得到的差替換原來的較大數,繼續進行相減操作,直到兩個數相等為止。這種方法簡單直觀,無需復雜的數學運算,僅通過減法即可實現,特別適合于手工計算或在不支持除法運算的環境中使用。

二進制GCD算法,也稱為Stein算法,是一種高效計算最大公因數的方法,它通過位運算和減法操作來逐步簡化問題。算法的核心思想是利用二進制的特性,首先判斷兩個數是否都是偶數,如果是,則同時除以2并記錄下除的次數;接著通過減法和位移操作逐步減小兩個數的差距,直到它們相等,此時的值乘以之前記錄的除2的次數即為最大公因數。這種方法避免了復雜的除法運算,僅使用位移和減法,特別適合在計算機中實現,因為它充分利用了計算機對二進制運算的高效處理能力。

此外還有一些其他的方法,如利用Fibonacci數列的性質、利用同余關系等,但這些方法通常只在特定情況下使用,或者作為理論研究的工具。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78756.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WebSocket與Socket、TCP、HTTP的關系及區別

1.什么是WebSocket及原理 WebSocket是HTML5中新協議、新API。 WebSocket從滿足基于Web的日益增長的實時通信需求應運而生,解決了客戶端發起多個Http請求到服務器資源瀏覽器必須要在經過長時間的輪詢問題,實現里多路復用,是全雙工、雙向、單套…

基于C++的IOT網關和平臺4:github項目ctGateway交互協議

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github:codetoys,所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C++的,可以在任何平臺上使用。 源碼指引:github源碼指引_初級代碼游戲的博客-CSDN博客 系…

【PPT制作利器】DeepSeek + Kimi生成一個初始的PPT文件

如何基于DeepSeek Kimi進行PPT制作 步驟: Step1:基于DeepSeek生成文本,提問 Step2基于生成的文本,用Kimi中PPT助手一鍵生成PPT 進行PPT渲染-自動渲染 可選擇更改模版 生成PPT在桌面 介紹的比較詳細,就是這個PPT模版…

拷貝多個Excel單元格區域為圖片并粘貼到Word

Excel工作表Sheet1中有兩個報表,相應單元格區域分別定義名稱為Report1和Report2,如下圖所示。 現在需要將圖片拷貝圖片粘貼到新建的Word文檔中。 示例代碼如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…

Spring是如何傳播事務的?什么是事務傳播行為

Spring是如何傳播事務的? Spring框架通過聲明式事務管理來傳播事務,主要依賴于AOP(面向切面編程)和事務攔截器來實現。Spring的事務傳播機制是基于Java Transaction API (JTA) 或者本地資源管理器(如Hibernate、JDBC等…

Python-pandas-操作Excel文件(讀取數據/寫入數據)及Excel表格列名操作詳細分享

Python-pandas-操作Excel文件(讀取數據/寫入數據) 提示:幫幫志會陸續更新非常多的IT技術知識,希望分享的內容對您有用。本章分享的是pandas的使用語法。前后每一小節的內容是存在的有:學習and理解的關聯性。【幫幫志系列文章】:每…

PHP分頁顯示數據,在phpMyadmin中添加數據

<?php $conmysqli_connect(localhost,root,,stu); mysqli_query($con,"set names utf8"); //設置字符集為utf8 $sql"select * from teacher"; $resultmysqli_query($con,$sql); $countmysqli_num_rows($result); //記錄總條數$count。 $pagesize10;//每…

智能參謀部系統架構和業務場景功能實現

將以一個基于微服務和云原生理念、深度集成人工智能組件、強調實時性與韌性的系統架構為基礎,詳細闡述如何落地“智能參謀部”的各項能力。這不是一個簡單的軟件堆疊,而是一個有機整合了數據、知識、模型、流程與人員的復雜體系。 系統愿景:“智能參謀部”——基于AI賦能的…

企業級RAG架構設計:從FAISS索引到HyDE優化的全鏈路拆解,金融/醫療領域RAG落地案例與避坑指南(附架構圖)

本文較長&#xff0c;純干貨&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習內容&#xff0c;盡在聚客AI學院。 一. RAG技術概述 1.1 什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09; 是…

Spring Boot Validation實戰詳解:從入門到自定義規則

目錄 一、Spring Boot Validation簡介 1.1 什么是spring-boot-starter-validation&#xff1f; 1.2 核心優勢 二、快速集成與配置 2.1 添加依賴 2.2 基礎配置 三、核心注解詳解 3.1 常用校驗注解 3.2 嵌套對象校驗 四、實戰開發步驟 4.1 DTO類定義校驗規則 4.2 Cont…

理清緩存穿透、緩存擊穿、緩存雪崩、緩存不一致的本質與解決方案

在構建高性能系統中&#xff0c;緩存&#xff08;如Redis&#xff09; 是不可或缺的關鍵組件&#xff0c;它大幅減輕了數據庫壓力、加快了響應速度。然而&#xff0c;在高并發環境下&#xff0c;緩存也可能帶來一系列棘手的問題&#xff0c;如&#xff1a;緩存穿透、緩存擊穿、…

PyTorch_構建線性回歸

使用 PyTorch 的 API 來手動構建一個線性回歸的假設函數&#xff0c;數據加載器&#xff0c;損失函數&#xff0c;優化方法&#xff0c;繪制訓練過程中的損失變化。 數據構建 import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt i…

005-nlohmann/json 基礎方法-C++開源庫108杰

《二、基礎方法》&#xff1a;節點訪問、值獲取、顯式 vs 隱式、異常處理、迭代器、類型檢測、異常處理……一節課搞定C處理JSON數據85%的需求…… JSON 字段的簡單類型包括&#xff1a;number、boolean、string 和 null&#xff08;即空值&#xff09;&#xff1b;復雜類型則有…

HarmonyOS 5.0 分布式數據協同與跨設備同步??

大家好&#xff0c;我是 V 哥。 使用 Mate 70有一段時間了&#xff0c;系統的絲滑使用起來那是爽得不要不要的&#xff0c;隨著越來越多的應用適配&#xff0c;目前使用起來已經和4.3的兼容版本功能差異無礙了&#xff0c;還有些純血鴻蒙獨特的能力很是好用&#xff0c;比如&am…

Linux云計算訓練營筆記day02(Linux、計算機網絡、進制)

Linux 是一個操作系統 Linux版本 RedHat Rocky Linux CentOS7 Linux Ubuntu Linux Debian Linux Deepin Linux 登錄用戶 管理員 root a 普通用戶 nsd a 打開終端 放大: ctrl shift 縮小: ctrl - 命令行提示符 [rootlocalhost ~]# ~ 家目錄 /root 當前登錄的用戶…

macOS 安裝了Docker Desktop版終端docker 命令沒辦法使用

macOS 安裝了Docker Desktop版終端docker 命令沒辦法使用 1、檢查Docker Desktop能否正常運行。 確保Docker Desktop能正常運行。 2、檢查環境變量是否添加 1、添加環境變量 如果環境變量中沒有包含Docker的路徑&#xff0c;你可以手動添加。首先&#xff0c;找到Docker的…

Gradio全解20——Streaming:流式傳輸的多媒體應用(5)——基于WebRTC的攝像頭實時目標檢測

Gradio全解20——Streaming&#xff1a;流式傳輸的多媒體應用&#xff08;5&#xff09;——基于WebRTC的攝像頭實時目標檢測 本篇摘要20. Streaming&#xff1a;流式傳輸的多媒體應用20.5 基于WebRTC的攝像頭實時目標檢測20.5.1 環境配置及說明1. WebRTC2. TURN服務器 20.5.2 …

OSCP - Proving Grounds - NoName

主要知識點 linux命令注入SUID find提權 具體步驟 從nmap開始搜集信息&#xff0c;只開放了一個80端口 Nmap scan report for 192.168.171.15 Host is up (0.40s latency). Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE VERSION 80/tcp open http …

c++_csp-j算法 (6)_高精度算法(加減乘除)

高精度算法 C++高精度算法是指在C++編程語言中實現高精度計算的算法。在C++中,通常整數的范圍是有限的,超出這個范圍的整數計算會導致溢出。高精度算法的出現,使得C++程序能夠處理超出常規整數范圍的大整數計算,包括高精度加法、減法、乘法、除法等運算。 在C++中實現高精…

從OpenMP中的不兼容,窺探AI應用開發中的并行編程

在AI相關的項目開發中,偶然遇到下面這個問題: OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the progr am. That is dangerous, sin…