2 个版本
0.1.5 | 2024 年 7 月 13 日 |
---|---|
0.1.4 | 2024 年 5 月 6 日 |
0.1.3 |
|
#397 in 加密学
每月 111 次下载
12KB
100 行
RotaryAdd:无符号整数的循环算术
此软件包提供了 3 个特质,RotaryAdd
、CycleAdd
和 SeriesAdd
,它们具有简单的循环或模加法和减法方法,适用于三种无符号整数类型: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()方法。