| // Copyright 2016 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package big |
| |
| import ( |
| "fmt" |
| "testing" |
| ) |
| |
| var primes = []string{ |
| "2", |
| "3", |
| "5", |
| "7", |
| "11", |
| |
| "13756265695458089029", |
| "13496181268022124907", |
| "10953742525620032441", |
| "17908251027575790097", |
| |
| // https://golang.org/issue/638 |
| "18699199384836356663", |
| |
| "98920366548084643601728869055592650835572950932266967461790948584315647051443", |
| "94560208308847015747498523884063394671606671904944666360068158221458669711639", |
| |
| // http://primes.utm.edu/lists/small/small3.html |
| "449417999055441493994709297093108513015373787049558499205492347871729927573118262811508386655998299074566974373711472560655026288668094291699357843464363003144674940345912431129144354948751003607115263071543163", |
| "230975859993204150666423538988557839555560243929065415434980904258310530753006723857139742334640122533598517597674807096648905501653461687601339782814316124971547968912893214002992086353183070342498989426570593", |
| "5521712099665906221540423207019333379125265462121169655563495403888449493493629943498064604536961775110765377745550377067893607246020694972959780839151452457728855382113555867743022746090187341871655890805971735385789993", |
| "203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123", |
| |
| // ECC primes: http://tools.ietf.org/html/draft-ladd-safecurves-02 |
| "3618502788666131106986593281521497120414687020801267626233049500247285301239", // Curve1174: 2^251-9 |
| "57896044618658097711785492504343953926634992332820282019728792003956564819949", // Curve25519: 2^255-19 |
| "9850501549098619803069760025035903451269934817616361666987073351061430442874302652853566563721228910201656997576599", // E-382: 2^382-105 |
| "42307582002575910332922579714097346549017899709713998034217522897561970639123926132812109468141778230245837569601494931472367", // Curve41417: 2^414-17 |
| "6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151", // E-521: 2^521-1 |
| } |
| |
| var composites = []string{ |
| "0", |
| "1", |
| "21284175091214687912771199898307297748211672914763848041968395774954376176754", |
| "6084766654921918907427900243509372380954290099172559290432744450051395395951", |
| "84594350493221918389213352992032324280367711247940675652888030554255915464401", |
| "82793403787388584738507275144194252681", |
| } |
| |
| func TestProbablyPrime(t *testing.T) { |
| nreps := 20 |
| if testing.Short() { |
| nreps = 1 |
| } |
| for i, s := range primes { |
| p, _ := new(Int).SetString(s, 10) |
| if !p.ProbablyPrime(nreps) { |
| t.Errorf("#%d prime found to be non-prime (%s)", i, s) |
| } |
| } |
| |
| for i, s := range composites { |
| c, _ := new(Int).SetString(s, 10) |
| if c.ProbablyPrime(nreps) { |
| t.Errorf("#%d composite found to be prime (%s)", i, s) |
| } |
| if testing.Short() { |
| break |
| } |
| } |
| |
| // check that ProbablyPrime panics if n <= 0 |
| c := NewInt(11) // a prime |
| for _, n := range []int{-1, 0, 1} { |
| func() { |
| defer func() { |
| if n <= 0 && recover() == nil { |
| t.Fatalf("expected panic from ProbablyPrime(%d)", n) |
| } |
| }() |
| if !c.ProbablyPrime(n) { |
| t.Fatalf("%v should be a prime", c) |
| } |
| }() |
| } |
| } |
| |
| func BenchmarkProbablyPrime(b *testing.B) { |
| p, _ := new(Int).SetString("203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123", 10) |
| for _, rep := range []int{1, 5, 10, 20} { |
| b.Run(fmt.Sprintf("Rep=%d", rep), func(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| p.ProbablyPrime(rep) |
| } |
| }) |
| } |
| } |