Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Sources/IntegerUtilities/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ See https://swift.org/LICENSE.txt for license information

add_library(IntegerUtilities
DivideWithRounding.swift
GCD.swift
GreatestCommonDivisor.swift
Rotate.swift
RoundingRule.swift
SaturatingArithmetic.swift
Expand Down
40 changes: 0 additions & 40 deletions Sources/IntegerUtilities/GCD.swift

This file was deleted.

35 changes: 35 additions & 0 deletions Sources/IntegerUtilities/GreatestCommonDivisor.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//===--- GreatestCommonDivisor.swift --------------------------*- swift -*-===//
//
// This source file is part of the Swift Numerics open source project
//
// Copyright (c) 2021-2025 Apple Inc. and the Swift Numerics project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//

/// The [greatest common divisor][gcd] of `a` and `b`.
///
/// If both inputs are zero, the result is zero. If one input is zero, the
/// result is the absolute value of the other input.
///
/// [gcd]: https://en.wikipedia.org/wiki/Greatest_common_divisor
@inlinable
public func gcd<T: BinaryInteger>(_ a: T, _ b: T) -> T.Magnitude {
var x = a
var y = b

if x.magnitude < y.magnitude {
swap(&x, &y)
}

// Euclidean algorithm for GCD. It's worth using Lehmer instead for larger
// integer types, but for now this is good and dead-simple and faster than
// the other obvious choice, the binary algorithm.
while y != 0 {
(x, y) = (y, x % y)
}

return x.magnitude
}
2 changes: 1 addition & 1 deletion Tests/IntegerUtilitiesTests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ See https://swift.org/LICENSE.txt for license information
add_library(IntegerUtilitiesTests
DivideTests.swift
DoubleWidthTests.swift
GCDTests.swift
GreatestCommonDivisorTests.swift
RotateTests.swift
SaturatingArithmeticTests.swift
ShiftTests.swift)
Expand Down
44 changes: 0 additions & 44 deletions Tests/IntegerUtilitiesTests/GCDTests.swift

This file was deleted.

42 changes: 42 additions & 0 deletions Tests/IntegerUtilitiesTests/GreatestCommonDivisorTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//===--- GreatestCommonDivisorTests.swift ---------------------*- swift -*-===//
//
// This source file is part of the Swift Numerics open source project
//
// Copyright (c) 2021-2025 Apple Inc. and the Swift Numerics project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

import IntegerUtilities
import Testing

struct `Greatest Common Divisor Tests` {
@Test func `gcd<BinaryInteger>`() async throws {
#expect(gcd(0, 0) == 0)
#expect(gcd(0, 1) == 1)
#expect(gcd(1, 0) == 1)
#expect(gcd(0, -1) == 1)
#expect(gcd(-1, 0) == 1)
#expect(gcd(1, 1) == 1)
#expect(gcd(1, 2) == 1)
#expect(gcd(2, 2) == 2)
#expect(gcd(4, 2) == 2)
#expect(gcd(6, 8) == 2)
#expect(gcd(77, 91) == 7)
#expect(gcd(24, -36) == 12)
#expect(gcd(-24, -36) == 12)
#expect(gcd(51, 34) == 17)
#expect(gcd(64, 96) == 32)
#expect(gcd(-64, 96) == 32)
#expect(gcd(4*7*19, 27*25) == 1)
#expect(gcd(16*315, 11*315) == 315)
#expect(gcd(97*67*53*27*8, 83*67*53*9*32) == 67*53*9*8)
#expect(gcd(Int.max, Int.max) == Int.max)
#expect(gcd(0, Int.min) == Int.min.magnitude)
#expect(gcd(Int.min, 0) == Int.min.magnitude)
#expect(gcd(Int.min, Int.min) == Int.min.magnitude)
}
}