summaryrefslogtreecommitdiff
path: root/factor_info.go
diff options
context:
space:
mode:
Diffstat (limited to 'factor_info.go')
-rw-r--r--factor_info.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/factor_info.go b/factor_info.go
new file mode 100644
index 0000000..ee04e32
--- /dev/null
+++ b/factor_info.go
@@ -0,0 +1,109 @@
+package main
+
+import (
+ "aphopkins/radix_info/factors"
+ "fmt"
+ "io"
+ "math"
+ "slices"
+)
+
+// FactorInfo contains all of the information this program
+// calculates about a radix.
+type FactorInfo struct {
+ // The radix this info is about
+ Radix uint
+ // A representation of this radix as a product of prime numbers.
+ // Most of the important info about radices is determined through this.
+ PrimeFactorization factors.PrimeFactorization
+ // The radix's factors, in sorted order.
+ Factors []uint
+ // An estimate of the utility of the radix's factors.
+ Score float64
+ // The fraction of digits that are totatives (numbers that share no
+ // factors with the radix - they are the worst kind of digits)
+ TotativeRatio float64
+ // A rank measuring how well the radix works with the most elementary
+ // numbers and ratios
+ BasicRank string
+ // Whether or not this radix is part of any special factor-related classes.
+ // This is not calculated if the radix is too large - in this case
+ // this field will be nil.
+ Type *factors.NumberType
+ // An estimate of the complexity of the radix's multiplication table.
+ // This is not calculated if the radix is too large - in this case
+ // this field will be nil.
+ MTC *uint64
+ // The radix's natural logarithm. This determines the length of numbers
+ // in this radix - higher Ln means numbers take up fewer digits.
+ // If c = log(a)/log(b), then numbers in radix b will be around
+ // c times longer than numbers in radix a.
+ Ln float64
+ // Information about each digit's compatibility with the radix.
+ // This determines what kind of decimal expansion the digit's
+ // reciprocoal has and what patterns are in its row of the multiplication
+ // table.
+ DigitMap []factors.DigitType
+}
+
+func GetFactorInfo(radix uint) *FactorInfo {
+ r_factors := factors.Factors(radix)
+ slices.Sort(r_factors)
+
+ var r_type_ptr *factors.NumberType
+ var mtc_ptr *uint64
+ if radix < 1<<32 {
+ r_type := factors.Type(uint32(radix))
+ r_type_ptr = &r_type
+ mtc := factors.MTC(uint64(radix))
+ mtc_ptr = &mtc
+ } else {
+ r_type_ptr = nil
+ mtc_ptr = nil
+ }
+
+ var digitMap []factors.DigitType
+ if radix <= maxSmallRadix {
+ digitMap = factors.DigitMap(radix)
+ } else {
+ digitMap = []factors.DigitType{}
+ }
+
+ return &FactorInfo{radix, factors.PrimeFactorize(radix),
+ r_factors, factors.Score(radix), factors.TotativeRatio(radix),
+ factors.BasicRank(radix), r_type_ptr, mtc_ptr,
+ math.Log(float64(radix)), digitMap}
+}
+
+func (fi *FactorInfo) WriteTo(w io.Writer) {
+ fmt.Fprintln(w, fi.Radix, "=", fi.PrimeFactorization)
+ fmt.Fprintf(w, "Factors: %v (Score: %.2f)\n", fi.Factors, fi.Score)
+ fmt.Fprintf(w, "Totative Ratio: %.1f%%\n", fi.TotativeRatio * 100.0)
+ fmt.Fprintln(w, "2345 Rank:", fi.BasicRank)
+ if fi.Type != nil {
+ writeTypeMessage(w, *fi.Type)
+ }
+ if fi.MTC != nil {
+ fmt.Fprintln(w, "Multiplication Table Complexity:", *fi.MTC)
+ } else {
+ fmt.Fprintf(w, "Multiplication Table Complexity ≤ %.4g\n",
+ float32(fi.Radix)*float32(fi.Radix-2))
+ }
+ fmt.Fprintf(w, "Natural Logarithm: %.2f\n", fi.Ln)
+ if len(fi.DigitMap) > 0 {
+ writeDigitMap(w, fi.DigitMap)
+ }
+}
+
+func writeTypeMessage(w io.Writer, t factors.NumberType) {
+ switch t {
+ case factors.ColossallyAbundant:
+ fmt.Fprintln(w, "This radix is colossally abundant!")
+ case factors.Superabundant:
+ fmt.Fprintln(w, "This radix is superabundant.")
+ case factors.OrderedExponent:
+ fmt.Fprintln(w, "This radix has ordered exponents.")
+ case factors.Practical:
+ fmt.Fprintln(w, "This radix is practical.")
+ }
+}