#unsigned-integer #modular-arithmetic #limit #addition #u8 #u16 #u32

rotary-add

此软件包为 u8、u16 和 u32 这三个最低的无符号整数类型添加了一些简单的方法,以允许在相同的 0 到 (limit - 1) 范围内或从 1 到 limit 进行循环加法和减法。

2 个版本

0.1.5 2024 年 7 月 13 日
0.1.4 2024 年 5 月 6 日
0.1.3 2024 年 3 月 20 日

#397 in 加密学

Download history 153/week @ 2024-05-06 1/week @ 2024-05-20 3/week @ 2024-05-27 101/week @ 2024-07-08 10/week @ 2024-07-15

每月 111 次下载

GPL-2.0-or-later WITH Bison-exception-2…

12KB
100

mirror crates.io docs.rs

RotaryAdd:无符号整数的循环算术

此软件包提供了 3 个特质,RotaryAddCycleAddSeriesAdd,它们具有简单的循环或模加法和减法方法,适用于三种无符号整数类型:u8、u16 和 u32。与默认的 +- 运算符不同,加法和减法永远不会溢出。

RotaryAdd

此特质具有在无符号整数整个范围内执行加法和减法的方法,例如,对于 u8 是从 0 到 255,对于 u16 是从 0 到 65535。以下示例使用 8 位无符号整数和 rotary_add 以及 rotary_sub 说明了该概念。

加法

let first_number: u8 = 255;
let second_number: u8 = 6;

let result = first_number.rotary_add(&second_number);
// yields 5. first_number + second_number would panic as the value would overflow

减法

let first_number: u8 = 3;
let second_number: u8 = 6;
let result = first_number.rotary_sub(&second_number);
// yields 253. first_number - second_number would panic as the value would overflow

CycleAdd

此特质提供了允许您定义自定义 循环基数 的加法和减法方法。

以下示例说明了该概念

加法

let first_number: u8 = 22;
let second_number: u8 = 6;

let result = first_number.cycle_add(&second_number, 24);
// yields 4. We have to use u8 as a primitive data type with a higher maximum value

减法

let first_number: u8 = 37;
let second_number: u8 = 78;
let result = first_number.cycle_sub(&second_number, 100);
// yields 59. first_number - second_number would panic as the value would overflow

从 1 开始的连续加法、减法和模运算

许多常见的序列从1开始。一年中的月份、一个月中的天数和星期几通常用1到最大值之间的数字表示。遗憾的是,这种表示法在模运算中不适用,因为加法或减法会导致溢出。如果1代表星期一,7代表星期日,我们会期望 2(星期二)- 3 等于7(星期日),以及 6(星期六)+ 1 等于7(星期日)。相反,我们需要从输入数字中减去1,该数字可能不低于1,然后对该最大数进行模运算,最后将1加到结果上。方法 series_add()series_sub()series_mod() 避免了在处理基于1的序列时需要进行这些转换。

let sample_month_1: u8 = 11;
let limit = 12; // months of the year
let result = sample_month_1.series_add(1, limit);
// yields 12. 
let sample_month_2: u8 = 3;
let result = sample_month_2.series_sub(3, limit);
// yields 12

let sample_month_value: u8 = 24; // 24th month
let result = sample_month_value.series_mod(limit);
// yields 12, but would yield 0 with 0-indexed modulus

与相关的Ring360 crate不同,这个库仅扩展了核心无符号整数类型,用于密码学、计量学和作为其他crate的构建块,例如,在编码阶段首先将字符转换为u32值,然后在一个方向上移动它们的值,在解码阶段进行逆过程。

开发笔记

这是一个alpha版本,但其他方面功能已完整。

0.1.2

  • 添加了series_add()、series_sub()、series_mod()方法。

无运行时依赖