Wilson primes of order n: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added Go)
(→‎{{header|Raku}}: Add a Raku example)
Line 78: Line 78:
11: 17 2713
11: 17 2713
</pre>
</pre>

=={{header|Raku}}==
<lang perl6>sub postfix:<!> (Int $n) { (constant f = 1, |[\*] 1..*)[$n] }

my @primes = ^1.1e4 .grep: *.is-prime;

-> $n { say "$n: " ~ @primes.grep: { next if $_ < $n; (($n - 1)! * ($_ - $n)! - (-1) ** $n) %% .² } } for 1..11;</lang>
{{out}}
<pre>1: 5 13 563
2: 2 3 11 107 4931
3: 7
4: 10429
5: 5 7 47
6: 11
7: 17
8:
9: 541
10: 11 1109
11: 17 2713</pre>


=={{header|Wren}}==
=={{header|Wren}}==

Revision as of 16:49, 28 July 2021

Wilson primes of order n is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Definition

A Wilson prime of order n is a prime number p such that divides exactly:

(n − 1)! x (p − n)! − (− 1)ⁿ.


If n is 1, the latter formula reduces to the more familiar: (p - n)! + 1 where the only known examples for p are 5, 13 and 563.


Task

Calculate and show on this page the Wilson primes, if any, for orders n = 1 to 11 inclusive and for primes p < 18 or, if your language supports big integers, for p < 11,000.


Related task


Go

Translation of: Wren
Library: Go-rcu

<lang go>package main

import (

   "fmt"
   "math/big"
   "rcu"

)

func main() {

   const LIMIT = 11000
   primes := rcu.Primes(LIMIT)
   facts := make([]*big.Int, LIMIT)
   facts[0] = big.NewInt(1)
   for i := int64(1); i < LIMIT; i++ {
       facts[i] = new(big.Int)
       facts[i].Mul(facts[i-1], big.NewInt(i))
   }
   sign := int64(1)
   f := new(big.Int)
   zero := new(big.Int)
   fmt.Println(" n:  Wilson primes")
   fmt.Println("--------------------")
   for n := 1; n < 12; n++ {
       fmt.Printf("%2d:  ", n)
       sign = -sign
       for _, p := range primes {
           if p < n {
               continue
           }
           f.Mul(facts[n-1], facts[p-n])
           f.Sub(f, big.NewInt(sign))
           p2 := int64(p * p)
           bp2 := big.NewInt(p2)
           if f.Rem(f, bp2).Cmp(zero) == 0 {
               fmt.Printf("%d ", p)
           }
       }
       fmt.Println()
   }

}</lang>

Output:
 n:  Wilson primes
--------------------
 1:  5 13 563 
 2:  2 3 11 107 4931 
 3:  7 
 4:  10429 
 5:  5 7 47 
 6:  11 
 7:  17 
 8:  
 9:  541 
10:  11 1109 
11:  17 2713 

Raku

<lang perl6>sub postfix:<!> (Int $n) { (constant f = 1, |[\*] 1..*)[$n] }

my @primes = ^1.1e4 .grep: *.is-prime;

-> $n { say "$n: " ~ @primes.grep: { next if $_ < $n; (($n - 1)! * ($_ - $n)! - (-1) ** $n) %% .² } } for 1..11;</lang>

Output:
1: 5 13 563
2: 2 3 11 107 4931
3: 7
4: 10429
5: 5 7 47
6: 11
7: 17
8: 
9: 541
10: 11 1109
11: 17 2713

Wren

Library: Wren-math
Library: Wren-big
Library: Wren-fmt

<lang ecmascript>import "/math" for Int import "/big" for BigInt import "/fmt" for Fmt

var limit = 11000 var primes = Int.primeSieve(limit) var facts = List.filled(limit, null) facts[0] = BigInt.one for (i in 1...11000) facts[i] = facts[i-1] * i var sign = 1 System.print(" n: Wilson primes") System.print("--------------------") for (n in 1..11) {

   Fmt.write("$2d:  ", n)
   sign = -sign
   for (p in primes) {
       if (p < n) continue
       var f = facts[n-1] * facts[p-n] - sign
       if (f.isDivisibleBy(p*p)) Fmt.write("%(p) ", p)
   }
   System.print()

}</lang>

Output:
 n:  Wilson primes
--------------------
 1:  5 13 563 
 2:  2 3 11 107 4931 
 3:  7 
 4:  10429 
 5:  5 7 47 
 6:  11 
 7:  17 
 8:  
 9:  541 
10:  11 1109 
11:  17 2713