Modular arithmetic and bitwise operations
.package(url: "https://github.com/DavidSkrundz/Math.git", .upToNextMinor(from: "1.4.0"))Declares the four random() functions that come with FixedWidthInteger
Declares modular arithmetic operations
func modulo(_ modulo: Self) -> Self
func adding(_ other: Self, modulo: Self) -> Self
func subtracting(_ other: Self, modulo: Self) -> Self
func multiplying(_ other: Self, modulo: Self) -> Self
func exponentiating(by exponent: Self, modulo: Self) -> Self
func inverse(modulo: Self) -> Self?
func gcdDecomposition(_ other: Self) -> (gcd: Self, selfCount: Self, otherCount: Self)FloatingPoint and BinaryInteger define modulo
BinaryInteger where Self: ModularOperations defines exponentiating and inverse
FixedWidthInteger implements the remaining functions
Int, Int8, Int16, Int32, Int64, UInt, UInt8, UInt16, UInt32, and UInt64 all conform to ModularOperations
Bit Rotation:
static func >>> <RHS: BinaryInteger>(lhs: Self, rhs: RHS) -> Self
static func <<< <RHS: BinaryInteger>(lhs: Self, rhs: RHS) -> SelfSquare Root
func sqrt() -> SelfByte Conversion:
var littleEndianBytes: [UInt8]
var bigEndianBytes: [UInt8]String Conversion:
var hexString: StringBit Packing/Unpacking:
func asBigEndian<T: BinaryInteger>(sourceBits: Int = MemoryLayout<Element>.size * 8, resultBits: Int = MemoryLayout<T>.size * 8) -> [T]
func asLittleEndian<T: BinaryInteger>(sourceBits: Int = MemoryLayout<Element>.size * 8, resultBits: Int = MemoryLayout<T>.size * 8) -> [T]A protocol used for defining custom finite fields. It implements Numeric, Strideable, and LosslessStringConvertible
Defining a new FiniteFieldInteger:
struct F_31: FiniteFieldInteger {
static var Order = UInt8(31) // Must be prime
var value: Element = 0
}Implemented functionality:
init()
init(_ value: Element)
init(integerLiteral value: Element)
init?(_ description: String)
init?<T>(exactly source: T) where T: BinaryInteger
var description: String
func distance(to other: Self) -> Int
func advanced(by n: Int) -> Self
static func == (lhs: Self, rhs: Self) -> Bool
static func < (lhs: Self, rhs: Self) -> Bool
static func ... (minimum: Self, maximum: Self) -> ClosedRange<Self>
static func + (lhs: Self, rhs: Self) -> Self
static func - (lhs: Self, rhs: Self) -> Self
static func * (lhs: Self, rhs: Self) -> Self
static func / (lhs: Self, rhs: Self) -> Self
static func % (lhs: Self, rhs: Self) -> Self
func exponentiating(by value: Element) -> Self
static func += (lhs: inout Self, rhs: Self)
static func -= (lhs: inout Self, rhs: Self)
static func *= (lhs: inout Self, rhs: Self)
static func /= (lhs: inout Self, rhs: Self)
static func %= (lhs: inout Self, rhs: Self)An arbitrary precision unsigned integer type. It conforms to UnsignedInteger and ModularOperations, and provides func power<T: BinaryInteger>(of exponent: T) -> BigUInt
gcdDecomposition() of BigUInt only returns a valid gcd. The selfCount and otherCount values are meaningless (and always zero)
Currently there is no BigInt implementation so the Strideable conformance comes from the standard library meaning it is not safe to call distance(to other: BigUInt) or advanced(by n: BigInt) unless the difference is within the range of Int