From 12416ef3ea7ade91cadf06444fb6720cbf69f37e Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 4 Sep 2015 17:09:29 +0200 Subject: Add simple ticker --- main.go | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/main.go b/main.go index 7a3454a..e773b98 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,7 @@ // Linear search factorization package main -//go:generate openssl genrsa -out test.key 64 +//go:generate openssl genrsa -out test.key 48 //go:generate openssl rsa -in test.key -noout -text // 64 bit ~ 17 min @@ -16,6 +16,7 @@ import ( "io/ioutil" "log" "math/big" + "time" "github.com/cznic/mathutil" ) @@ -29,47 +30,57 @@ func seed(N *big.Int) (<-chan *big.Int, <-chan *big.Int) { q := new(big.Int).Div(N, p) q.SetBit(q, 0, 1) // ensure it's odd + // step 2 to next odd + two := big.NewInt(2) + nxt := make(chan *big.Int) - go func(c chan *big.Int, n *big.Int) { - two := big.NewInt(2) + go func(c chan *big.Int, n, step *big.Int) { for { // search next prime - n.Add(n, two) + n.Add(n, step) if n.ProbablyPrime(1) { c <- new(big.Int).Set(n) } } - }(nxt, p) + }(nxt, p, two) prv := make(chan *big.Int) - go func(c chan *big.Int, n *big.Int) { - two := big.NewInt(2) + go func(c chan *big.Int, n, step *big.Int) { for { // search previous prime - n.Sub(n, two) + n.Sub(n, step) if n.ProbablyPrime(1) { c <- new(big.Int).Set(n) } } - }(prv, q) + }(prv, q, two) return nxt, prv } func factor(N *big.Int) (*big.Int, *big.Int) { nxt, prv := seed(N) + m := new(big.Int) p := <-nxt q := <-prv + t := time.NewTicker(time.Second) + defer t.Stop() + for { - switch m.Mul(p, q).Cmp(N) { - case -1: // m < N, go up - p = <-nxt - case 0: // found - return p, q - case 1: // m > N, go down - q = <-prv + select { + case <-t.C: + fmt.Println(p, q) + default: + switch m.Mul(p, q).Cmp(N) { + case -1: // m < N, go up + p = <-nxt + case 0: // found + return p, q + case 1: // m > N, go down + q = <-prv + } } } -- cgit v1.2.3