ModulusOperandi

Banner Logo

Twitter: @cypher_poet

用于 Swift 整数和浮点类型的声明式、多算法的模运算。

模运算算法有多种变体,它们使用欧几里得除法、截断除法或向下取整除法。此外,Swift 内置的 % 运算符——虽然在某些语言中用作模数——严格地用作余数运算符

这些细微差别可能导致模运算代码在意图和正确性上都含糊不清——而这正是 ModulusOperandi 试图解决的问题。

特性

安装

Xcode 项目

选择 File -> Swift Packages -> Add Package Dependency 并输入 https://github.com/CypherPoet/ModulusOperandi

Swift Package Manager 项目

您可以将 ModulusOperandi 作为依赖项添加到您的 Package.swift 文件中

let package = Package(
    //...
    dependencies: [
        .package(url: "https://github.com/CypherPoet/ModulusOperandi", from: "0.2.2"),
    ],
    //...
)

然后,在您想使用它的任何地方,只需 import ModulusOperandi 即可。

用法

在文件中导入 ModulusOperandi 后,符合 BinaryIntegerFloatingPointInteger 的类型将被扩展一个 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 CLI Examples

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 文件