Pierpont primes: Difference between revisions

m
syntax highlighting fixup automation
m (→‎Finesse version: note use of 'ntheory' module)
m (syntax highlighting fixup automation)
Line 32:
As in the second Go sample, generates the 3-smooth number sequence to find Pierpoint Prime candidates. Uses a sliding window on the sequence to avoid having to keep it all in memory.
{{libheader|ALGOL 68-primes}}
<langsyntaxhighlight lang="algol68">BEGIN # find some pierpoint primes of the first kind (2^u3^v + 1) #
# and second kind (2^u3^v - 1) #
# construct a sieve of primes up to 10 000 #
Line 127:
print pierpoint( pfirst, "First" );
print pierpoint( psecond, "Second" )
END</langsyntaxhighlight>
{{out}}
<pre>
Line 147:
=={{header|C}}==
{{trans|D}}
<langsyntaxhighlight lang="c">#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
Line 270:
}
printf("\n");
}</langsyntaxhighlight>
{{out}}
<pre>First 50 Pierpont primes of the first kind:
Line 287:
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
using System.Numerics;
Line 459:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>First 50 Pierpont primes of the first kind:
Line 480:
=={{header|C++}}==
{{libheader|GMP}}
<langsyntaxhighlight lang="cpp">#include <cassert>
#include <algorithm>
#include <iomanip>
Line 572:
std::cout << "250th Pierpont prime of the second kind: " << p2 << '\n';
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 596:
=={{header|D}}==
{{trans|C#}}
<langsyntaxhighlight lang="d">import std.algorithm;
import std.bigint;
import std.random;
Line 760:
writefln("%dth Pierpont prime of the first kind: %d", p[0].length, p[0][$ - 1]);
writefln("%dth Pierpont prime of the second kind: %d", p[1].length, p[1][$ - 1]);
}</langsyntaxhighlight>
{{out}}
<pre>First 50 Pierpont primes of the first kind:
Line 788:
{{Trans|Go}}
Thanks Rudy Velthuis for the [https://github.com/rvelthuis/DelphiBigNumbers Velthuis.BigIntegers.Primes and Velthuis.BigIntegers] library.<br>
<syntaxhighlight lang="delphi">
<lang Delphi>
program Pierpont_primes;
 
Line 859:
 
readln;
end.</langsyntaxhighlight>
=={{header|F_Sharp|F#}}==
This task uses [[Extensible_prime_generator#The_functions|Extensible Prime Generator (F#)]].<br>
<langsyntaxhighlight lang="fsharp">
// Pierpont primes . Nigel Galloway: March 19th., 2021
let fN g=let mutable g=g in ((fun()->g),fun()->g<-g+g;())
Line 872:
pierpontT1|>Seq.take 50|>Seq.iter(printf "%d "); printfn ""
pierpontT2|>Seq.take 50|>Seq.iter(printf "%d "); printfn ""
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 879:
</pre>
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: fry grouping io kernel locals make math math.functions
math.primes prettyprint sequences sorting ;
 
Line 907:
"250th Pierpont prime of the second kind: " write
249 second nth .
]</langsyntaxhighlight>
{{out}}
<pre>
Line 930:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">#define NPP 50
 
Function isPrime(Byval n As Ulongint) As Boolean
Line 988:
If j Mod 10 = 0 Then Print
Next j
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,015:
 
However, in order to be sure that the first 250 Pierpont primes will be generated, it is necessary to choose the loop sizes to produce somewhat more than this and then sort them into order.
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,076:
fmt.Println("\n250th Pierpont prime of the first kind:", pp[249])
fmt.Println("\n250th Pierpont prime of the second kind:", pp2[249])
}</langsyntaxhighlight>
 
{{out}}
Line 1,108:
These timings are for my Celeron @1.6GHz and should therefore be much faster on a more modern machine.
 
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,200:
elapsed := time.Now().Sub(start)
fmt.Printf("\nTook %s\n", elapsed)
}</langsyntaxhighlight>
 
{{out}}
Line 1,236:
Uses arithmoi Library: https://hackage.haskell.org/package/arithmoi-0.11.0.0 for prime generation and prime testing.<br>
n-smooth generation function based on [[Hamming_numbers#Avoiding_generation_of_duplicates]]
<langsyntaxhighlight lang="haskell">import Control.Monad (guard)
import Data.List (intercalate)
import Data.List.Split (chunksOf)
Line 1,276:
where
rows = chunksOf 10 . take 50
commas = reverse . intercalate "," . chunksOf 3 . reverse . show</langsyntaxhighlight>
{{out}}
<pre>
Line 1,304:
Implementation (first kind first):
 
<langsyntaxhighlight Jlang="j"> 5 10$(#~ 1 p:])1+/:~,*//2 3x^/i.20
2 3 5 7 13 17 19 37 73 97
109 163 193 257 433 487 577 769 1153 1297
Line 1,315:
2591 4373 6143 6911 8191 8747 13121 15551 23327 27647
62207 73727 131071 139967 165887 294911 314927 442367 472391 497663
524287 786431 995327 1062881 2519423 10616831 17915903 25509167 30233087 57395627</langsyntaxhighlight>
 
and
 
<langsyntaxhighlight Jlang="j"> 249{ (#~ 1 p:])1+/:~,*//2 3x^/i.112
62518864539857068333550694039553
249{ (#~ 1 p:])_1+/:~,*//2 3x^/i.112
4111131172000956525894875083702271</langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">
import java.math.BigInteger;
import java.text.NumberFormat;
Line 1,391:
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,430:
 
'''Preliminaries'''
<langsyntaxhighlight lang="jq">def is_prime:
. as $n
| if ($n < 2) then false
Line 1,454:
 
def table($ncols; $colwidth):
nwise($ncols) | map(lpad($colwidth)) | join(" ");</langsyntaxhighlight>
'''Pierpont primes'''
<langsyntaxhighlight lang="jq"># Input: the target number of primes of the form p(u,v) == 2^u * 3^v ± 1.
# The main idea is to let u run from 0:m and v run from 0:n where n ~~ 0.63 * m.
# Initially we start with plausible values for m and n ($maxm and $maxn respectively),
Line 1,520:
50
| "\nThe first \(.) Pierpoint primes of the first kind:", (pierponts(true) | table(10;8)),
"\nThe first \(.) Pierpoint primes of the second kind:", (pierponts(false) | table(10;8))</langsyntaxhighlight>
{{out}}
<pre>
Line 1,540:
=={{header|Julia}}==
The generator method is very fast but does not guarantee the primes are generated in order. Therefore we generate two times the primes needed and then sort and return the lower half.
<langsyntaxhighlight lang="julia">using Primes
 
function pierponts(N, firstkind = true)
Line 1,572:
 
println("\nThe 2000th Pierpont prime (second kind) is: ", pierponts(2000, false)[2000])
</langsyntaxhighlight>{{out}}
<pre>
The first 50 Pierpont primes (first kind) are: BigInt[2, 3, 5, 7, 13, 17, 19, 37, 73, 97, 109, 163, 193, 257, 433, 487, 577, 769, 1153, 1297, 1459, 2593, 2917, 3457, 3889, 10369, 12289, 17497, 18433, 39367, 52489, 65537, 139969, 147457, 209953, 331777, 472393, 629857, 746497, 786433, 839809, 995329, 1179649, 1492993, 1769473, 1990657, 2654209, 5038849, 5308417, 8503057]
Line 1,593:
=={{header|Kotlin}}==
{{trans|Go}}
<langsyntaxhighlight lang="scala">import java.math.BigInteger
import kotlin.math.min
 
Line 1,670:
println("\n2000th Pierpont prime of the first kind: ${p[0][1999]}")
println("\n2000th Pierpont prime of the first kind: ${p[1][1999]}")
}</langsyntaxhighlight>
{{out}}
<pre>First 50 Pierpont primes of the first kind:
Line 1,699:
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">local function isprime(n)
if n < 2 then return false end
if n % 2 == 0 then return n==2 end
Line 1,748:
for i, p in ipairs(p2) do
io.write(string.format("%8d%s", p, (i%10==0 and "\n" or " ")))
end</langsyntaxhighlight>
{{out}}
<pre>First 50 Pierpont primes of the first kind:
Line 1,766:
=={{header|M2000 Interpreter}}==
{{trans|freebasic}}
<langsyntaxhighlight M2000lang="m2000 Interpreterinterpreter">Module Pierpoint_Primes {
Form 80
Set Fast !
Line 1,821:
end function
}
Pierpoint_Primes</langsyntaxhighlight>
 
{{out}}
Line 1,841:
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">ClearAll[FindUpToMax]
FindUpToMax[max_Integer, b_Integer] := Module[{res, num},
res = {};
Line 1,867:
Part[FindUpToMax[10^130, +1], 1000]
Print["1000th Piermont prime of the second kind:"]
Part[FindUpToMax[10^150, -1], 1000]</langsyntaxhighlight>
{{out}}
<pre>Piermont primes of the first kind:
Line 1,884:
 
=={{header|Nim}}==
<langsyntaxhighlight Nimlang="nim">import math, strutils
 
func isPrime(n: int): bool =
Line 1,940:
stdout.write ($n).align(9)
inc count
if count mod 10 == 0: stdout.write '\n'</langsyntaxhighlight>
 
{{out}}
Line 1,960:
{{trans|Raku}}
{{libheader|ntheory}}
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 2,012:
 
say "\n250th Pierpont prime of the first kind: " . $pierpont_1st[249];
say "\n250th Pierpont prime of the second kind: " . $pierpont_2nd[249];</langsyntaxhighlight>
{{out}}
<pre>First 50 Pierpont primes of the first kind:
Line 2,036:
{{trans|Go}}
I also tried using a priority queue, popping the smallest (and any duplicates of it) and pushing *2 and *3 on every iteration, which worked pretty well but ended up about 20% slower, with about 1500 untested candidates left in the queue by the time it found the 2000th second kind.
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">-- demo/rosetta/Pierpont_primes.exw</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
Line 2,104:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Took %s\n"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">elapsed</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">))</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 2,134:
 
=={{header|Prolog}}==
<syntaxhighlight lang="prolog">
<lang Prolog>
?- use_module(library(heaps)).
 
Line 2,223:
 
?- main.
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 2,234:
=={{header|Python}}==
{{trans|Go}}
<langsyntaxhighlight lang="python">import random
 
# Copied from https://rosettacode.org/wiki/Miller-Rabin_primality_test#Python
Line 2,311:
print "250th Pierpont prime of the second kind:", pp2[249]
 
main()</langsyntaxhighlight>
{{out}}
<pre>First 50 Pierpont primes of the first kind:
Line 2,334:
Using trial division to determine primality makes finding the 250th Pierpont primes impractical. This should be updated when a coding of a more suitable test becomes available.
 
<langsyntaxhighlight Quackerylang="quackery"> [ stack ] is pierponts
[ stack ] is kind
[ stack ] is quantity
Line 2,364:
cr cr
say "Pierpont primes of the second kind." cr
50 2 pierpontprimes echo</langsyntaxhighlight>
 
{{out}}
Line 2,385:
produces exactly what is needed, in order, on demand.
{{libheader|ntheory}}
<syntaxhighlight lang="raku" perl6line>use ntheory:from<Perl5> <is_prime>;
 
sub pierpont ($kind is copy = 1) {
Line 2,418:
say "\n250th Pierpont prime of the first kind: " ~ pierpont[249];
 
say "\n250th Pierpont prime of the second kind: " ~ pierpont(2)[249];</langsyntaxhighlight>
 
{{out}}
Line 2,444:
(Cut down output as it is exactly the same as the first version for {2,3} +1 and {2,3} -1; leaves room to demo some other options.)
 
<syntaxhighlight lang="raku" perl6line>sub smooth-numbers (*@list) {
cache my \Smooth := gather {
my %i = (flat @list) Z=> (Smooth.iterator for ^@list);
Line 2,482:
say "$title smooth \{$primes\} {$add > 0 ?? '+' !! '-'} 1 ";
put smooth-numbers(|$primes).map( * + $add ).grep( *.is-prime )[^$count]
}</langsyntaxhighlight>
 
{{Out}}
Line 2,536:
The REXX language has a "big num" capability to handle almost any amount of decimal digits, &nbsp; but
<br>it lacks a robust &nbsp; '''isPrime''' &nbsp; function. &nbsp; Without that, verifying very large primes is problematic.
<langsyntaxhighlight lang="rexx">/*REXX program finds and displays Pierpont primes of the first and second kinds. */
parse arg n . /*obtain optional argument from the CL.*/
if n=='' | n=="," then n= 50 /*Not specified? Then use the default.*/
Line 2,571:
_= pu*pv + t; if _ >s then m= min(_, m)
end /*jv*/
end /*ju*/ /*see the RETURN (above). */</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
<pre>
Line 2,590:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
load "stdlib.ring"
 
Line 2,647:
 
see "done2..." + nl
</syntaxhighlight>
</lang>
Output:
<pre>
Line 2,760:
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">require 'gmp'
 
def smooth_generator(ar)
Line 2,790:
puts_cols(pierpont(-1).take(n))
puts "#{m}th Pierpont prime of the second kind: #{pierpont(-1).take(250).last}"
</syntaxhighlight>
</lang>
{{out}}
<pre>First 50 Pierpont primes of the first kind:
Line 2,809:
</pre>
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func smooth_generator(primes) {
var s = primes.len.of { [1] }
{
Line 2,837:
say "\n#{n}th Pierpont prime of the 1st kind: #{p}"
say "#{n}th Pierpont prime of the 2nd kind: #{q}"
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,862:
Using AttaSwift's BigInt library.
 
<langsyntaxhighlight lang="swift">import BigInt
import Foundation
 
Line 2,918:
print()
print("250th Pierpoint prime of the first kind: \(primes.first[249])")
print("250th Pierpoint prime of the second kind: \(primes.second[249])")</langsyntaxhighlight>
 
{{out}}
Line 2,934:
{{libheader|Wren-fmt}}
The 3-smooth version. Just the first 250 - a tolerable 14 seconds or so on my machine.
<langsyntaxhighlight lang="ecmascript">import "/big" for BigInt
import "/fmt" for Fmt
 
Line 2,994:
 
System.print("\n250th Pierpont prime of the first kind: %(p[0][249])")
System.print("\n250th Pierpont prime of the second kind: %(p[1][249])")</langsyntaxhighlight>
 
{{out}}
Line 3,021:
{{libheader|GMP}} GNU Multiple Precision Arithmetic Library
Using GMP's probabilistic primes makes it is easy and fast to test for primeness.
<langsyntaxhighlight lang="zkl">var [const] BI=Import("zklBigNum"); // libGMP
var [const] one=BI(1), two=BI(2), three=BI(3);
 
Line 3,049:
}
return(pps1,pps2)
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">pps1,pps2 := pierPonts(2_000);
 
println("The first 50 Pierpont primes (first kind):");
Line 3,061:
println("\n%4dth Pierpont prime, first kind: ".fmt(n), pps1[n-1]);
println( " second kind: ", pps2[n-1]);
}</langsyntaxhighlight>
{{out}}
<pre style="font-size:83%">
10,327

edits