summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-09-04 17:09:29 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-09-04 17:09:29 +0200
commit12416ef3ea7ade91cadf06444fb6720cbf69f37e (patch)
treec3ccf4e7994ab9e09467afbc293712bfed174cb9
parentd0259cff3ccbab96732097a8a2c339e0e75f0123 (diff)
Add simple ticker
-rw-r--r--main.go43
1 files 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
+ }
}
}