Modular arithmetic: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: removed a spurious ?)
(Add swift)
Line 1,409: Line 1,409:
{{out}}
{{out}}
<pre>1 「mod 13」</pre>
<pre>1 「mod 13」</pre>

=={{header|Swift}}==

{{trans|Scala}}

<lang swift>protocol Ring {
associatedtype RingType: Numeric

var one: Self { get }

static func +(_ lhs: Self, _ rhs: Self) -> Self
static func *(_ lhs: Self, _ rhs: Self) -> Self
static func **(_ lhs: Self, _ rhs: Int) -> Self
}

extension Ring {
static func **(_ lhs: Self, _ rhs: Int) -> Self {
var ret = lhs.one

for _ in stride(from: rhs, to: 0, by: -1) {
ret = ret * lhs
}

return ret
}
}

struct ModInt: Ring {
typealias RingType = Int

var value: Int
var modulo: Int

var one: ModInt { ModInt(1, modulo: modulo) }

init(_ value: Int, modulo: Int) {
self.value = value
self.modulo = modulo
}

static func +(lhs: ModInt, rhs: ModInt) -> ModInt {
precondition(lhs.modulo == rhs.modulo)

return ModInt((lhs.value + rhs.value) % lhs.modulo, modulo: lhs.modulo)
}

static func *(lhs: ModInt, rhs: ModInt) -> ModInt {
precondition(lhs.modulo == rhs.modulo)

return ModInt((lhs.value * rhs.value) % lhs.modulo, modulo: lhs.modulo)
}
}

func f<T: Ring>(_ x: T) -> T { (x ** 100) + x + x.one }

let x = ModInt(10, modulo: 13)
let y = f(x)

print("x ^ 100 + x + 1 for x = ModInt(10, 13) is \(y)")</lang>

{{out}}

<pre>x ^ 100 + x + 1 for x = ModInt(10, 13) is ModInt(value: 1, modulo: 13)</pre>


=={{header|Tcl}}==
=={{header|Tcl}}==