sundries

Assorted little morsels for your enjoyment

git clone https://code.pdelong.com/sundries.git

 1package main
 2
 3import (
 4	"fmt"
 5	"math/big"
 6)
 7
 8func val(slice []*big.Int, index int) *big.Int {
 9	if index < 0 || index >= len(slice) {
10		return big.NewInt(0)
11	}
12
13	return slice[index]
14}
15
16func pascal(current []*big.Int) []*big.Int {
17	next := make([]*big.Int, len(current)+1)
18
19	for i := range next {
20		next[i] = big.NewInt(0)
21		next[i].Add(val(current, i-1), val(current, i))
22	}
23
24	return next
25}
26
27func print(slice []*big.Int) {
28	for i, n := range slice {
29		if i < len(slice)-1 {
30			fmt.Printf("%d ", n)
31		} else {
32			fmt.Println(n)
33		}
34	}
35}
36
37var two = big.NewInt(2)
38var zero = big.NewInt(0)
39
40func numOdd(slice []*big.Int) int64 {
41	var odd int64 = 0
42	for _, n := range slice {
43		mod := big.NewInt(0)
44		mod.Mod(n, two)
45		if mod.Cmp(zero) == 1 {
46			odd += 1
47		}
48	}
49
50	return odd
51}
52
53func totalNums(rows int64) *big.Int {
54	nums := big.NewInt(rows)
55	nums.Mul(nums, big.NewInt(rows+1))
56	nums.Div(nums, big.NewInt(2))
57
58	return nums
59}
60
61const lastRow int64 = 127
62
63func main() {
64	curr := []*big.Int{big.NewInt(1)}
65	totalOdd := big.NewInt(numOdd(curr))
66	for i := 0; int64(i) < lastRow; i++ {
67		curr = pascal(curr)
68		totalOdd.Add(totalOdd, big.NewInt(numOdd(curr)))
69	}
70
71	frac := big.NewRat(0, 1)
72	nums := totalNums(lastRow + 1)
73	frac.SetFrac(totalOdd, nums)
74	fmt.Println(totalOdd, nums, frac)
75}