master
Raw Download raw file
 1package main
 2
 3import (
 4	"fmt"
 5	"github.com/montanaflynn/stats"
 6	"math"
 7	"math/big"
 8	"math/rand"
 9	"time"
10)
11
12type Trial struct {
13	A       *big.Int
14	B       *big.Int
15	Coprime bool
16}
17
18func main() {
19	var i uint64
20
21	fmt.Printf("n trials, max rand, variance, min, q1, q2, q3, max\n")
22	for i = 1; i < 100; i++ {
23		var max_rand = big.NewInt(120)
24		var num_trials = 2 << i
25		var exp_pis []float64
26		for i := 1; i <= 4096; i++ {
27			exp_pis = append(exp_pis, Experiment(max_rand, num_trials))
28		}
29		max, _ := stats.Max(exp_pis)
30		min, _ := stats.Min(exp_pis)
31		mean, _ := stats.Mean(exp_pis)
32		variance, _ := stats.Variance(exp_pis)
33		q, _ := stats.Quartile(exp_pis)
34		fmt.Printf("%d, %d, %f, %f, %f, %f, %f, %f\n", num_trials, max_rand, variance, min, q.Q1, mean, q.Q3, max)
35	}
36
37	fmt.Printf("n trials, max rand, variance, min, q1, q2, q3, max\n")
38	for i = 1; i < 100; i++ {
39		var max_rand = big.NewInt(2 << i)
40		var num_trials = 500
41		var exp_pis []float64
42		for i := 1; i <= 4096; i++ {
43			exp_pis = append(exp_pis, Experiment(max_rand, num_trials))
44		}
45		max, _ := stats.Max(exp_pis)
46		min, _ := stats.Min(exp_pis)
47		mean, _ := stats.Mean(exp_pis)
48		variance, _ := stats.Variance(exp_pis)
49		q, _ := stats.Quartile(exp_pis)
50		fmt.Printf("%d, %d, %f, %f, %f, %f, %f, %f\n", num_trials, max_rand, variance, min, q.Q1, mean, q.Q3, max)
51	}
52}
53
54func Experiment(max_rand *big.Int, num_trials int) (exp_pi float64) {
55	trials := make([]Trial, num_trials)
56	r := rand.New(rand.NewSource(time.Now().UnixNano()))
57	cc := 0 // coprime count
58	for i, t := range trials {
59		var C *big.Int
60		t.A, t.B, C = big.NewInt(0), big.NewInt(0), big.NewInt(0)
61		trials[i].A = t.A.Rand(r, max_rand)
62		trials[i].B = t.B.Rand(r, max_rand)
63		C = C.GCD(nil, nil, t.A, t.B)
64		if C.Cmp(big.NewInt(1)) == 0 {
65			trials[i].Coprime = true
66			cc += 1
67		}
68	}
69	//for _, t := range trials {
70	//	fmt.Printf("%s, %s, %s, %t\n", t.A.String(), t.B.String(), t.C.String(), t.Coprime)
71	//}
72	return math.Sqrt(6 / (float64(cc) / float64(num_trials)))
73}