aboutsummaryrefslogtreecommitdiff
path: root/challenge-148/pokgopun/go/ch-2.go
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-148/pokgopun/go/ch-2.go')
-rw-r--r--challenge-148/pokgopun/go/ch-2.go152
1 files changed, 152 insertions, 0 deletions
diff --git a/challenge-148/pokgopun/go/ch-2.go b/challenge-148/pokgopun/go/ch-2.go
new file mode 100644
index 0000000000..5c3c3bb22d
--- /dev/null
+++ b/challenge-148/pokgopun/go/ch-2.go
@@ -0,0 +1,152 @@
+// From https://math.stackexchange.com/questions/1885095/parametrization-of-cardano-triplet
+// a = 3k + 2
+// b^2 * c = (k+1)^2 * (8k + 5)
+package main
+
+import (
+ "fmt"
+ "math"
+ "sort"
+ "strings"
+)
+
+func main() {
+ cdn := newCdn3(400)
+ fmt.Println(cdn)
+}
+
+func pmap(n uint) []bool {
+ m := make([]bool, int(n)+1)
+ for i := 2; i <= int(n); i++ {
+ m[i] = true
+ }
+ for i := 2; float64(i) <= math.Sqrt(float64(n)); i++ {
+ j := i * i
+ for j <= int(n) {
+ m[j] = false
+ j += i
+ }
+
+ }
+ return m
+}
+
+type cdn3 struct {
+ k uint
+ pmap []bool
+ plist []int
+}
+
+func newCdn3(n uint) (c cdn3) {
+ c.k = n
+ // create prime map as large as sqrt of (8k + 5) which is the term we need to do factoriing
+ //c.pmap = pmap(uint(math.Floor(math.Sqrt(float64(8*n) + 5))))
+ // create prime map as large as (8k + 5) to make it easy to check prime for factoring the number
+ c.pmap = pmap(uint((8 * n) + 5))
+ for i := 2; i < len(c.pmap); i++ {
+ if c.pmap[i] {
+ c.plist = append(c.plist, i)
+ }
+ }
+ return c
+}
+
+func (cdn cdn3) a(k uint) int {
+ return int(3*k + 2)
+}
+
+func (cdn cdn3) bc(k uint) (s [][2]int) {
+ b := int(k + 1)
+ c := int(8*k + 5)
+ //bIsPrime := big.NewInt(int64(b)).ProbablyPrime(10)
+ //cIsPrime := big.NewInt(int64(c)).ProbablyPrime(10)
+ s = append(s, [2]int{1, b * b * c})
+ factor := []int{}
+ if cdn.pmap[c] {
+ if b == 1 {
+ return s
+ }
+ if cdn.pmap[b] {
+ s = append(s, [2]int{b, c})
+ return s
+ } else {
+ factor = append(factor, cdn.factor(b)...)
+ factor = append(factor, factor...)
+ factor = append(factor, c)
+ }
+ } else {
+ if cdn.pmap[b] {
+ factor = append(factor, b, b)
+ } else {
+ factor = append(factor, cdn.factor(b)...)
+ factor = append(factor, factor...)
+ }
+ factor = append(factor, cdn.factor(c)...)
+ }
+ sort.SliceStable(factor, func(i, j int) bool {
+ return factor[i] < factor[j]
+ })
+ fmt.Println("b =", b, "c =", c, "factor =>", factor, len(factor))
+ var (
+ prev int
+ pair, lone []int
+ )
+ for _, v := range factor {
+ if prev == v {
+ pair = append(pair, v)
+ prev = 0
+ } else if prev == 0 {
+ prev = v
+ } else {
+ lone = append(lone, prev)
+ prev = v
+ }
+ }
+ if prev != 0 {
+ lone = append(lone, prev)
+ }
+ fmt.Println("factor =>", "pair =", pair, "lone =", lone)
+ return s
+}
+
+func (cdn cdn3) factor(n int) (s []int) {
+ if n > 1 {
+ if cdn.pmap[n] {
+ return []int{n}
+ }
+ i := 0
+ for {
+ if n%cdn.plist[i] != 0 {
+ i++
+ } else {
+ s = append(s, cdn.plist[i])
+ n /= cdn.plist[i]
+ if n == 1 {
+ break
+ } else if cdn.pmap[n] {
+ s = append(s, n)
+ break
+ }
+ }
+ }
+ }
+ return s
+}
+
+func (cdn cdn3) abc(k uint) (s [][3]int) {
+ for _, v := range cdn.bc(k) {
+ s = append(s, [3]int{cdn.a(k), v[0], v[1]})
+ }
+ return s
+}
+
+func (cdn cdn3) String() string {
+ var b strings.Builder
+ for k := 0; k <= int(cdn.k); k++ {
+ for _, v := range cdn.abc(uint(k)) {
+ //fmt.Println(v)
+ b.WriteString(fmt.Sprintln(v))
+ }
+ }
+ return b.String()
+}