summaryrefslogtreecommitdiff
path: root/factors
diff options
context:
space:
mode:
authorAdrien Hopkins <adrien.p.hopkins@gmail.com>2023-08-25 08:55:30 -0500
committerAdrien Hopkins <adrien.p.hopkins@gmail.com>2023-08-25 08:55:30 -0500
commit99c4b2d9980dd14e8c43ffbf00660047335ada4b (patch)
tree400aac6fc6694327454ba91e6fe6973282106769 /factors
parent24a8dde3a708b0cd95007d940e8957b21df40055 (diff)
Limit MTC calculation to < 2^32
This ensures the output can fit into a uint64. Also, calculating it at this stage is slow, and not calculating it can make the program nearly instant even for very large numbers!
Diffstat (limited to 'factors')
-rw-r--r--factors/factors_test.go6
-rw-r--r--factors/mtc.go8
2 files changed, 7 insertions, 7 deletions
diff --git a/factors/factors_test.go b/factors/factors_test.go
index 12d4384..33727c0 100644
--- a/factors/factors_test.go
+++ b/factors/factors_test.go
@@ -100,7 +100,7 @@ func TestBasicRank(t *testing.T) {
tableTest(t, BasicRank, basicRankCases, stdEquals, "BasicRank")
}
-var gcdCases = map[struct{ a, b uint }]uint{
+var gcdCases = map[struct{ a, b uint64 }]uint64{
{0, 0}: 0, {1, 1}: 1,
{6, 10}: 2, {10, 6}: 2,
{12, 20}: 4, {20, 12}: 4,
@@ -109,7 +109,7 @@ var gcdCases = map[struct{ a, b uint }]uint{
}
// a version of gcd() for testing purposes
-func gcdTest(c struct{ a, b uint }) uint {
+func gcdTest(c struct{ a, b uint64 }) uint64 {
return gcd(c.a, c.b)
}
@@ -117,7 +117,7 @@ func TestGCD(t *testing.T) {
tableTest(t, gcdTest, gcdCases, stdEquals, "gcd")
}
-var mtcCases = map[uint]uint{
+var mtcCases = map[uint64]uint64{
2: 0, 3: 0, 4: 2, 5: 10, 6: 8,
7: 28, 8: 26, 9: 42, 10: 42, 11: 88, 12: 52,
13: 130, 14: 100, 15: 116, 16: 138, 18: 146,
diff --git a/factors/mtc.go b/factors/mtc.go
index d008ca3..522a35c 100644
--- a/factors/mtc.go
+++ b/factors/mtc.go
@@ -3,15 +3,15 @@ package factors
// MTC returns the multiplication table complexity of a radix n.
// This is an estimate of how difficult it is to learn a radix's
// multiplication table.
-func MTC(n uint) uint {
- mtc := uint(0)
- for i := uint(2); i <= n - 2; i++ {
+func MTC(n uint64) uint64 {
+ mtc := uint64(0)
+ for i := uint64(2); i <= n - 2; i++ {
mtc += n / gcd(i, n)
}
return mtc
}
-func gcd(a, b uint) uint {
+func gcd(a, b uint64) uint64 {
for b > 0 {
a, b = b, a % b
}