Carmichael 3 strong pseudoprimes: Difference between revisions
Content added Content deleted
(Add Swift) |
|||
Line 2,780: | Line 2,780: | ||
61 x 3361 x 4021 = 824389441 |
61 x 3361 x 4021 = 824389441 |
||
</pre> |
</pre> |
||
=={{header|Swift}}== |
|||
{{trans|Rust}} |
|||
<lang swift>import Foundation |
|||
extension BinaryInteger { |
|||
@inlinable |
|||
public var isPrime: Bool { |
|||
if self == 0 || self == 1 { |
|||
return false |
|||
} else if self == 2 { |
|||
return true |
|||
} |
|||
let max = Self(ceil((Double(self).squareRoot()))) |
|||
for i in stride(from: 2, through: max, by: 1) { |
|||
if self % i == 0 { |
|||
return false |
|||
} |
|||
} |
|||
return true |
|||
} |
|||
} |
|||
@inlinable |
|||
public func carmichael<T: BinaryInteger & SignedNumeric>(p1: T) -> [(T, T, T)] { |
|||
func mod(_ n: T, _ m: T) -> T { (n % m + m) % m } |
|||
var res = [(T, T, T)]() |
|||
guard p1.isPrime else { |
|||
return res |
|||
} |
|||
for h3 in stride(from: 2, to: p1, by: 1) { |
|||
for d in stride(from: 1, to: h3 + p1, by: 1) { |
|||
if (h3 + p1) * (p1 - 1) % d != 0 || mod(-p1 * p1, h3) != d % h3 { |
|||
continue |
|||
} |
|||
let p2 = 1 + (p1 - 1) * (h3 + p1) / d |
|||
guard p2.isPrime else { |
|||
continue |
|||
} |
|||
let p3 = 1 + p1 * p2 / h3 |
|||
guard p3.isPrime && (p2 * p3) % (p1 - 1) == 1 else { |
|||
continue |
|||
} |
|||
res.append((p1, p2, p3)) |
|||
} |
|||
} |
|||
return res |
|||
} |
|||
let res = |
|||
(1..<62) |
|||
.lazy |
|||
.filter({ $0.isPrime }) |
|||
.map(carmichael) |
|||
.filter({ !$0.isEmpty }) |
|||
.flatMap({ $0 }) |
|||
for c in res { |
|||
print(c) |
|||
}</lang> |
|||
{{out}} |
|||
<pre>(3, 11, 17) |
|||
(5, 29, 73) |
|||
(5, 17, 29) |
|||
(5, 13, 17) |
|||
(7, 19, 67) |
|||
... |
|||
(61, 661, 2521) |
|||
(61, 271, 571) |
|||
(61, 241, 421) |
|||
(61, 3361, 4021)</pre> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |