用于 Swift 整数和浮点类型的声明式、多算法的模运算。
模运算算法有多种变体,它们使用欧几里得除法、截断除法或向下取整除法。此外,Swift 内置的 %
运算符——虽然在某些语言中用作模数——严格地用作余数运算符。
这些细微差别可能导致模运算代码在意图和正确性上都含糊不清——而这正是 ModulusOperandi
试图解决的问题。
BinaryInteger
和 FloatingPointInteger
的类型。选择 File
-> Swift Packages
-> Add Package Dependency
并输入 https://github.com/CypherPoet/ModulusOperandi
。
您可以将 ModulusOperandi
作为依赖项添加到您的 Package.swift
文件中
let package = Package(
//...
dependencies: [
.package(url: "https://github.com/CypherPoet/ModulusOperandi", from: "0.2.2"),
],
//...
)
然后,在您想使用它的任何地方,只需 import ModulusOperandi
即可。
在文件中导入 ModulusOperandi
后,符合 BinaryInteger
和 FloatingPointInteger
的类型将被扩展一个 modulus
函数。
此函数将其值视为 dividend
(被除数),并接受相同类型的 divisor
(除数)。它还接受一个可选的 mode
参数,用于选择欧几里得、截断或向下取整的模运算。
默认情况下,mode
将是欧几里得算法
import ModulusOperandi
let dividend = 5
let divisor = 3
dividend.modulo(divisor) // 2
dividend.modulo(-divisor) // 2
-dividend.modulo(divisor) // -2
-dividend.modulo(-divisor) // -2
// Same as...
dividend.modulo(divisor, mode: .euclidean) // 2
dividend.modulo(-divisor, mode: .euclidean) // 2
-dividend.modulo(divisor, mode: .euclidean) // -2
-dividend.modulo(-divisor, mode: .euclidean) // -2
import ModulusOperandi
let dividend = 5
let divisor = 3
dividend.modulo(3, mode: .flooring) // 2
dividend.modulo(-3, mode: .flooring) // -1
-dividend.modulo(3, mode: .flooring) // -2
-dividend.modulo(-3, mode: .flooring) // 1
import ModulusOperandi
let dividend = 5
let divisor = 3
dividend.modulo(3, mode: .truncating) // 2
dividend.modulo(-3, mode: .truncating) // 2
-dividend.modulo(3, mode: .truncating) // -2
-dividend.modulo(-3, mode: .truncating) // -2
ModulusOperandi
还附带一个命令行工具,允许您直接从命令行执行计算。
要安装它,请克隆该项目并运行 make
$ git clone git@github.com:CypherPoet/ModulusOperandi.git
$ cd ModulusOperandiCLI
$ make
命令行工具将被安装为 modulo
,运行 modulo --help
将显示一些有用的用法说明
modulo --help
OVERVIEW: Multi-algorithm modular arithmetic for Swift integers and
floating-Point types.
Modular arithmetic algorithms come in variants that use either Euclidean,
truncating, or flooring division.
This tool acts as a CLI for the `ModulusOperandi` Swift package -- which allows
you to perform modular arithmetic according to your desired algorithm.
📝 Note on Negative Numbers
----------------------------------------------
To use negative numbers, prefix the argument with `\ ` (including the space).
For example, -5 mod 4 would be passed as:
modulo \ -5 4
-5 mod -4 would be passed as:
modulo \ -5 \ -4
🔗 More Info On Modular Arithmetic
----------------------------------------------
- https://en.wikipedia.org/wiki/Modulo_operation#Variants_of_the_definition
USAGE: modulo <dividend> <divisor> [--euclidean] [--flooring] [--truncating]
ARGUMENTS:
<dividend> The dividend to perform division against.
<divisor> The divisor to use as a "modulus".
OPTIONS:
--euclidean/--flooring/--truncating
The algorithm to use for computing results. (default:
euclidean)
--version Show the version.
-h, --help Show help information.
区分负数和参数标志是命令行界面面临的一个众所周知的挑战。目前,Swift 的 Argument Parser 中对此的支持似乎是一个正在开发中的领域。不过,与此同时,modulo
命令可以通过一些巧妙的转义语法来接受负数参数。
只需在任何负数前加上 \
(包括空格)。就像这样
-5 mod 4
:
modulo \ -5 4
-5 mod -4
:
modulo \ -5 \ -4
5 mod -4
:
modulo 5 \ -4
非常欢迎对 ModulusOperandi
做出贡献。查看一些问题模板以获取更多信息。
文档由 Jazzy 生成。安装说明可以在 这里 找到,一旦您设置好它,就可以通过从命令行运行 jazzy
来简单地生成文档。
📝 请注意,这只会生成 docs
文件夹供您在本地查看。此文件夹被 git
忽略,因为存在一个操作来自动生成文档并在项目的 gh-pages
分支上提供它们。
ModulusOperandi
在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。