【typenum】 21 類型級別計算最大公約數(Gcd)

一、源碼

代碼實現了一個在類型級別計算最大公約數(GCD)的系統

  1. 定義(type_operators.rs)
/// A **type operator** that computes the [greatest common divisor][gcd] of `Self` and `Rhs`.
///
/// [gcd]: https://en.wikipedia.org/wiki/Greatest_common_divisor
///
/// # Example
///
/// ```rust
/// use unitrix::number::{Gcd, Unsigned, types::{U12, U8}};
///
/// assert_eq!(<U12 as Gcd<U8>>::Output::to_i32(), 4);
/// ```
pub trait Gcd<Rhs> {/// The greatest common divisor.type Output;
}
  1. 別名(operator_aliases.rs)
/// Alias for the associated type of `Gcd`: `Gcf<A, B> = <A as Gcd<B>>::Output>`
pub type Gcf<A, B> = <A as Gcd<B>>::Output;
  1. 無符號數實現(uint.rs)
/// gcd(0, 0) = 0
impl Gcd<U0> for U0 {type Output = U0;
}/// gcd(x, 0) = x
impl<X> Gcd<U0> for X
whereX: Unsigned + NonZero,
{type Output = X;
}/// gcd(0, y) = y
impl<Y> Gcd<Y> for U0
whereY: Unsigned + NonZero,
{type Output = Y;
}/// gcd(x, y) = 2*gcd(x/2, y/2) if both x and y even
impl<Xp, Yp> Gcd<Even<Yp>> for Even<Xp>
whereXp: Gcd<Yp>,Even<Xp>: NonZero,Even<Yp>: NonZero,
{type Output = UInt<Gcf<Xp, Yp>, B0>;
}/// gcd(x, y) = gcd(x, y/2) if x odd and y even
impl<Xp, Yp> Gcd<Even<Yp>> for Odd<Xp>
whereOdd<Xp>: Gcd<Yp>,Even<Yp>: NonZero,
{type Output = Gcf<Odd<Xp>, Yp>;
}/// gcd(x, y) = gcd(x/2, y) if x even and y odd
impl<Xp, Yp> Gcd<Odd<Yp>> for Even<Xp>
whereXp: Gcd<Odd<Yp>>,Even<Xp>: NonZero,
{type Output = Gcf<Xp, Odd<Yp>>;
}/// gcd(x, y) = gcd([max(x, y) - min(x, y)], min(x, y)) if both x and y odd
///
/// This will immediately invoke the case for x even and y odd because the difference of two odd
/// numbers is an even number.
impl<Xp, Yp> Gcd<Odd<Yp>> for Odd<Xp>
whereOdd<Xp>: Max<Odd<Yp>> + Min<Odd<Yp>>,Odd<Yp>: Max<Odd<Xp>> + Min<Odd<Xp>>,Maximum<Odd<Xp>, Odd<Yp>>: Sub<Minimum<Odd<Xp>, Odd<Yp>>>,Diff<Maximum<Odd<Xp>, Odd<Yp>>, Minimum<Odd<Xp>, Odd<Yp>>>: Gcd<Minimum<Odd<Xp>, Odd<Yp>>>,
{type Output =Gcf<Diff<Maximum<Odd<Xp>, Odd<Yp>>, Minimum<Odd<Xp>, Odd<Yp>>>, Minimum<Odd<Xp>, Odd<Yp>>>;
}#[cfg(test)]
mod gcd_tests {use super::*;use crate::consts::*;macro_rules! gcd_test {($( $a:ident, $b:ident => $c:ident ),* $(,)*) => {$(assert_eq!(<Gcf<$a, $b> as Unsigned>::to_usize(), $c::to_usize());assert_eq!(<Gcf<$b, $a> as Unsigned>::to_usize(), $c::to_usize());)*}}#[test]fn gcd() {gcd_test! {U0,   U0    => U0,U0,   U42   => U42,U12,  U8    => U4,U13,  U1013 => U1,  // Two primesU9,   U26   => U1,  // Not prime but coprimeU143, U273  => U13,U117, U273  => U39,}}
}

4.有符號整數實現(int.rs)

// ---------------------------------------------------------------------------------------
// Gcd
use crate::{Gcd, Gcf};impl Gcd<Z0> for Z0 {type Output = Z0;
}impl<U> Gcd<PInt<U>> for Z0
whereU: Unsigned + NonZero,
{type Output = PInt<U>;
}impl<U> Gcd<Z0> for PInt<U>
whereU: Unsigned + NonZero,
{type Output = PInt<U>;
}impl<U> Gcd<NInt<U>> for Z0
whereU: Unsigned + NonZero,
{type Output = PInt<U>;
}impl<U> Gcd<Z0> for NInt<U>
whereU: Unsigned + NonZero,
{type Output = PInt<U>;
}impl<U1, U2> Gcd<PInt<U2>> for PInt<U1>
whereU1: Unsigned + NonZero + Gcd<U2>,U2: Unsigned + NonZero,Gcf<U1, U2>: Unsigned + NonZero,
{type Output = PInt<Gcf<U1, U2>>;
}impl<U1, U2> Gcd<PInt<U2>> for NInt<U1>
whereU1: Unsigned + NonZero + Gcd<U2>,U2: Unsigned + NonZero,Gcf<U1, U2>: Unsigned + NonZero,
{type Output = PInt<Gcf<U1, U2>>;
}impl<U1, U2> Gcd<NInt<U2>> for PInt<U1>
whereU1: Unsigned + NonZero + Gcd<U2>,U2: Unsigned + NonZero,Gcf<U1, U2>: Unsigned + NonZero,
{type Output = PInt<Gcf<U1, U2>>;
}impl<U1, U2> Gcd<NInt<U2>> for NInt<U1>
whereU1: Unsigned + NonZero + Gcd<U2>,U2: Unsigned + NonZero,Gcf<U1, U2>: Unsigned + NonZero,
{type Output = PInt<Gcf<U1, U2>>;
}

二、核心概念

這是一個類型級編程的實現,使用Rust的trait系統在編譯時計算GCD,而不是運行時。所有計算都在類型系統層面完成。

三、源碼解析

  1. 定義(type_operators.rs)

pub trait Gcd<Rhs> {type Output;
}
  • 定義了一個泛型trait Gcd,其中Rhs是右操作數

  • 有一個關聯類型Output表示計算結果

  • 這是一個類型運算符,不包含實際方法,只有類型關聯

  1. 別名(operator_aliases.rs)

pub type Gcf<A, B> = <A as Gcd<B>>::Output;
  • 創建了類型別名Gcf(Greatest Common Factor)

  • 簡化了訪問GCD結果的語法:Gcf<A, B> 等價于 <A as Gcd>::Output

  1. 無符號數實現(uint.rs)

實現了歐幾里得算法的類型級版本:

基本情況:

  • gcd(0, 0) = 0

  • gcd(x, 0) = x (x ≠ 0)

  • gcd(0, y) = y (y ≠ 0)

遞歸情況:

  • 雙偶數:gcd(x, y) = 2 * gcd(x/2, y/2)

  • x奇y偶:gcd(x, y) = gcd(x, y/2)

  • x偶y奇:gcd(x, y) = gcd(x/2, y)

  • 雙奇數:gcd(x, y) = gcd(|x-y|, min(x,y))(利用兩奇數差為偶數的性質)

  1. 有符號整數實現(int.rs)

處理有符號整數的情況:

  • gcd(0, 0) = 0

  • gcd(0, ±y) = |y| (y ≠ 0)

  • gcd(±x, 0) = |x| (x ≠ 0)

  • gcd(±x, ±y) = gcd(|x|, |y|) - 結果總是正數

四、技術特點

  1. 類型級編程
  • 所有計算在編譯時完成

  • 使用trait系統和關聯類型表達計算

  • 結果在類型系統中可用,無需運行時計算

  1. 遞歸實現

基于歐幾里得算法,通過模式匹配(奇偶性)選擇正確的計算路徑
3. 零成本抽象

  • 編譯時計算,運行時無開銷

  • 類型安全:確保所有操作都在有效范圍內

五、使用示例


// 編譯時計算 gcd(12, 8) = 4
type Result = Gcf<U12, U8>;
assert_eq!(Result::to_i32(), 4); // 編譯時已知結果為4

六、設計優勢

  • 編譯時驗證:類型系統確保計算正確性

  • 零運行時開銷:所有計算在編譯期完成

  • 類型安全:防止無效操作(如除以零)

  • 模塊化設計:清晰的trait層次和實現分離

這是一個典型的使用Rust類型系統進行編譯時計算的例子,展示了如何利用trait系統和關聯類型來實現復雜的數學運算。

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

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

相關文章

如何為 Visual Studio 2019 安裝 WDK

我用nmake編譯代碼提示錯誤&#xff1a;fatal error U1052: 未找到文件“\makefile.def”&#xff0c;經過排查發現是代碼依賴WDK&#xff0c;所以研究了一下WDK的安裝步驟&#xff0c;下面是具體步驟&#xff1a; 請遵循以下步驟來為你的 VS2019 搭建完整的驅動開發環境&…

使用 Apache Flink CDC 3.0 實現 MySQL 到 Elasticsearch 的數據同步

下面我將創建一個完整的 Spring Boot 項目&#xff0c;使用 Flink CDC 3.0 基于 MySQL 的 binlog 實現數據同步到 Elasticsearch。 項目概述 這個項目將&#xff1a; 使用 Flink CDC 連接 MySQL 并讀取 binlog處理數據變化&#xff08;插入、更新、刪除&#xff09;將數據同步到…

Web網站的運行原理2

請求Web網站的文件-HTTP 可以使用HTTP協議在Web瀏覽器和Web服務器應用程序之間傳輸Web網頁的文件。 在進行HTTP傳輸之前&#xff0c;需要先在Web瀏覽器和Web服務器應用程序之間建立TCP連接。 使用HTTP請求可以要求Web瀏覽器向Web服務器應用程序傳輸文件。 傳輸Web網站的文件-HT…

論文閱讀:Do As I Can, Not As I Say: Grounding Language in Robotic Affordances

地址&#xff1a;Do As I Can, Not As I Say: Grounding Language in Robotic Affordances 摘要 大型語言模型&#xff08;LLM&#xff09;能夠編碼豐富的世界語義知識&#xff0c;這類知識對于機器人執行自然語言表達的高層級、時間擴展指令具有重要價值。然而&#xff0c;語…

Django管理后臺結合剪映實現課件視頻生成應用

在教學內容的數字化制作中&#xff0c;如何將課件與音頻快速轉換為視頻是一項高頻需求。借助管理后臺和剪輯工具&#xff0c;可以實現課件內容的下載、轉換和草稿生成&#xff0c;大幅減少重復操作。 【AI教育教學考試系統】課件在線剪映視頻草稿生成應用這里實現的課件PPT部分…

AI升級社區便民服務:AI辦事小程序高效辦證+應急系統秒響應,告別跑腿愁住得更安心

朋友&#xff0c;你有沒有在社區辦過事&#xff1f;想給孩子辦入學證明&#xff0c;得先跑居委會開證明&#xff0c;再去街道辦事處蓋章&#xff0c;來回幾趟不說&#xff0c;要是材料沒帶全&#xff0c;還得重新跑&#xff1b;家里水管爆了&#xff0c;半夜聯系物業&#xff0…

el-table-draggable拖拽實現表格內容排序

1、圖片2、安裝包import ElTableDraggable from "el-table-draggable";3、代碼&#xff08;html&#xff09;<el-table-draggable:data"soloTableData"input"dragInputHandlerSolo"><el-table:data"soloTableData"row-key&qu…

Linux設備模型技術路線圖

Linux設備模型涉及的技術和知識點 1. 核心架構組件 1.1 Kobject 子系統 kobject(內核對象):Linux設備模型的基礎構建塊 kset(對象集合):kobject的容器,管理相同類型的對象 ktype(對象類型):定義kobject的行為和屬性 引用計數機制:使用kref管理對象生命周期 對象層…

面試問題詳解六:元對象系統調用槽函數

Qt 的 元對象系統&#xff08;Meta-Object System&#xff09; 是 Qt 核心機制之一&#xff0c;正是它讓 C 語言具備了類似腳本語言&#xff08;如 Python&#xff09;的反射、動態綁定、屬性系統等能力。 自定義信號與槽&#xff0c;是 Qt 元對象系統最常見、最實用的體現。&a…

Scala面試題及詳細答案100道(1-10)-- 基礎語法與數據類型

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 1. 簡述Scala與Java的主要…

http請求有哪些?

TTP請求方法常見方法&#xff1a;GET&#xff1a;獲取資源&#xff0c;參數通過URL傳遞&#xff0c;可緩存到瀏覽器本地。POST&#xff1a;提交數據&#xff0c;參數通過請求體傳遞&#xff0c;不可緩存&#xff0c;常用于創建資源。PUT&#xff1a;更新資源&#xff0c;參數通…

MAPGIS6.7地質編錄

1.編錄文件excel位于D:\mapgis67\program\section&#xff0c;文件名稱&#xff1a;ZKInfoEdit.xls2生成副本&#xff0c;復制ZKInfoEdit.xls到桌面3開始編寫 04回次4開始編寫 03編錄5開始編寫 11采樣6開始編寫 06標志面7開始編寫 10鉆孔資料8 最后總結 …

輕松掌握Chrome插件開發全流程

Chrome插件開發概述介紹Chrome插件的基本概念、核心功能和應用場景&#xff0c;包括插件與瀏覽器擴展的區別、插件的主要組成部分&#xff08;如manifest文件、后臺腳本、內容腳本等&#xff09;。開發環境搭建列出開發Chrome插件所需的工具和環境配置&#xff0c;包括Chrome瀏…

智能二維碼QR\刷IC卡\人臉AI識別梯控系統功能設計需基于模塊化架構,整合物聯網、生物識別、權限控制等技術,以下是多奧分層次的系統設計框架

一、系統架構設計硬件層主控模塊&#xff1a;32位ARM嵌入式處理器&#xff0c;支持CAN/RS485/TCP/IP協議識別終端&#xff1a;支持IC卡(CPU/國密/HID)、二維碼掃碼器(動態碼)、人臉識別(活體檢測)電梯控制單元&#xff1a;繼電器矩陣控制板&#xff0c;支持20層以上電梯按鈕控制…

Kubernetes配置與密鑰管理深度指南:ConfigMap與Secret企業級實踐

目錄 專欄介紹 作者與平臺 您將學到什么&#xff1f; 學習特色 Kubernetes配置與密鑰管理深度指南&#xff1a;ConfigMap與Secret企業級實踐 一、 配置管理&#xff1a;云原生應用的基石 1.1 配置管理的演進與挑戰 1.2 ConfigMap與Secret的設計哲學 二、 ConfigMap深度…

知行社黃劍杰:金融跨界,重塑震區救援新章

曾在紐約證券交易所敲響上市鐘聲的黃劍杰&#xff0c;這位知行社的靈魂人物&#xff0c;此次在西藏震區開啟了一場震撼人心的“跨界救援”之旅。他帶著在華爾街積累的深厚金融智慧&#xff0c;毅然投身到這場與時間賽跑、與災難較量的戰斗中&#xff0c;為傳統救災模式帶來了顛…

API模型與接口棄用指南:歷史、替代方案及開發者應對策略

API模型及接口棄用&#xff08;Deprecation&#xff09;全解 概覽 在AI與API領域&#xff0c;模型的持續迭代與技術進步推動著平臺不斷優化服務。與此同時&#xff0c;隨著更安全、更強大的新模型推出&#xff0c;舊模型與接口的棄用&#xff08;Deprecation&#xff09;成為…

python3GUI--Joy音樂播放器 在線播放器 播放器 By:PyQt5(附下載地址)

文章目錄一&#xff0e;前言二&#xff0e;項目簡介三&#xff0e;詳細模塊介紹1.主界面2.歌單廣場3.歌單詳情頁4.歌手篩選5.歌手詳情頁6.專輯詳情頁7.歌曲榜單頁8.搜索結果頁9.其他1.托盤菜單2.設置四&#xff0e;核心問題回答1.軟件UI效果實現2.為什么我做不出來這么漂亮的界…

Spring Boot整合Feign實現RPC調用,并通過Hystrix實現服務降級

feign/openfeign和dubbo是常用的微服務RPC框架&#xff0c;由于feigin內部已經集成ribbon&#xff0c;自帶了負載均衡的功能&#xff0c;當有多個同名的服務注冊到注冊中心時&#xff0c;會根據ribbon默認的負載均衡算法將請求分配到不同的服務。這篇文章就簡單介紹一下怎么使用…

Java 性能優化實戰(三):并發編程的 4 個優化維度

在多核CPU時代&#xff0c;并發編程是提升Java應用性能的關鍵手段&#xff0c;但不合理的并發設計反而會導致性能下降、死鎖等問題。本文將聚焦并發編程的四個核心優化方向&#xff0c;通過真實案例和代碼對比&#xff0c;帶你掌握既能提升性能又能保證線程安全的實戰技巧。 一…