diff --git a/docs/mathutil.md b/docs/mathutil.md index 8ee1489..d78ad49 100644 --- a/docs/mathutil.md +++ b/docs/mathutil.md @@ -40,6 +40,8 @@ import ( - [RadianToAngle](#RadianToAngle) - [PointDistance](#PointDistance) - [IsPrime](#IsPrime) +- [GCD](#GCD) +- [LCM](#LCM)
@@ -702,4 +704,83 @@ func main() { // false // true } +``` + +### GCD + +

Return greatest common divisor (GCD) of integers.

+ +Signature: + +```go +func GCD[T constraints.Integer](integers ...T) T +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.GCD(1, 1) + result2 := mathutil.GCD(1, -1) + result3 := mathutil.GCD(-1, 1) + result4 := mathutil.GCD(-1, -1) + result5 := mathutil.GCD(3, 6, 9) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + + // Output: + // 1 + // 1 + // -1 + // -1 + // 3 +} +``` + + +### LCM + +

Return Least Common Multiple (LCM) of integers.

+ +Signature: + +```go +func LCM[T constraints.Integer](integers ...T) T +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.LCM(1, 1) + result2 := mathutil.LCM(1, 2) + result3 := mathutil.LCM(3, 6, 9) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + + // Output: + // 1 + // 2 + // 18 +} ``` \ No newline at end of file diff --git a/docs/mathutil_zh-CN.md b/docs/mathutil_zh-CN.md index dcb056b..f6a964d 100644 --- a/docs/mathutil_zh-CN.md +++ b/docs/mathutil_zh-CN.md @@ -40,6 +40,8 @@ import ( - [RadianToAngle](#RadianToAngle) - [PointDistance](#PointDistance) - [IsPrime](#IsPrime) +- [GCD](#GCD) +- [LCM](#LCM)
@@ -701,4 +703,84 @@ func main() { // false // false // true -} \ No newline at end of file +} +``` + +### GCD + +

计算最大公约数。

+ +函数签名: + +```go +func GCD[T constraints.Integer](integers ...T) T +``` + +示例: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.GCD(1, 1) + result2 := mathutil.GCD(1, -1) + result3 := mathutil.GCD(-1, 1) + result4 := mathutil.GCD(-1, -1) + result5 := mathutil.GCD(3, 6, 9) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + + // Output: + // 1 + // 1 + // -1 + // -1 + // 3 +} +``` + + +### LCM + +

计算最小公倍数。

+ +函数签名: + +```go +func LCM[T constraints.Integer](integers ...T) T +``` + +示例: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/mathutil" +) + +func main() { + result1 := mathutil.LCM(1, 1) + result2 := mathutil.LCM(1, 2) + result3 := mathutil.LCM(3, 6, 9) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + + // Output: + // 1 + // 2 + // 18 +} +``` \ No newline at end of file diff --git a/mathutil/mathutil.go b/mathutil/mathutil.go index d76303b..31c5996 100644 --- a/mathutil/mathutil.go +++ b/mathutil/mathutil.go @@ -287,8 +287,8 @@ func gcd[T constraints.Integer](a, b T) T { func LCM[T constraints.Integer](integers ...T) T { result := integers[0] - for i := 1; i < len(integers)-1; i++ { - result = lcm(result, integers[i]) + for k := range integers { + result = lcm(integers[k], result) } return result @@ -296,5 +296,8 @@ func LCM[T constraints.Integer](integers ...T) T { // find Least Common Multiple (LCM) via GCD. func lcm[T constraints.Integer](a, b T) T { + if a == 0 || b == 0 { + panic("lcm function: provide non zero integers only.") + } return a * b / gcd(a, b) } diff --git a/mathutil/mathutil_exmaple_test.go b/mathutil/mathutil_exmaple_test.go index 56a3bae..da73da1 100644 --- a/mathutil/mathutil_exmaple_test.go +++ b/mathutil/mathutil_exmaple_test.go @@ -281,3 +281,39 @@ func ExampleIsPrime() { // false // true } + +func ExampleGCD() { + result1 := GCD(1, 1) + result2 := GCD(1, -1) + result3 := GCD(-1, 1) + result4 := GCD(-1, -1) + result5 := GCD(3, 6, 9) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + + // Output: + // 1 + // 1 + // -1 + // -1 + // 3 +} + +func ExampleLCM() { + result1 := LCM(1, 1) + result2 := LCM(1, 2) + result3 := LCM(3, 6, 9) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + + // Output: + // 1 + // 2 + // 18 +} diff --git a/mathutil/mathutil_test.go b/mathutil/mathutil_test.go index 319015f..d82f8a4 100644 --- a/mathutil/mathutil_test.go +++ b/mathutil/mathutil_test.go @@ -239,12 +239,12 @@ func TestGCD(t *testing.T) { func TestLCM(t *testing.T) { assert := internal.NewAssert(t, "TestLCM") - assert.Equal(0, LCM(0)) assert.Equal(1, LCM(1)) assert.Equal(-1, LCM(-1)) - assert.Equal(0, LCM(0, -1)) - assert.Equal(0, LCM(0, 1)) + assert.Equal(-1, LCM(1, -1)) + assert.Equal(1, LCM(-1, 1)) assert.Equal(1, LCM(1, 1)) - assert.Equal(1, LCM(1, 2)) - assert.Equal(6, LCM(3, 6, 9)) + assert.Equal(-1, LCM(-1, -1)) + assert.Equal(2, LCM(1, 2)) + assert.Equal(18, LCM(3, 6, 9)) }