Quad-power prime seeds: Difference between revisions

m
→‎{{header|FreeBASIC}}: replaced program with faster version
(Added Go)
m (→‎{{header|FreeBASIC}}: replaced program with faster version)
Line 268:
 
=={{header|FreeBASIC}}==
{{libheader|GMP}}
<syntaxhighlight lang="vb">#include "isprime.bas"
<syntaxhighlight lang="freebasic">' version 13-04-2023
' compile with: fbc -s console
 
#Include "gmp.bi"
Function isQuadPowerPrime(n As Uinteger) As Boolean
#Define sieve_max 20050000
Dim As Uinteger p(n)
Dim As Uinteger k = n + 1
Return isPrime(n+n+1) And isPrime((n*n)+(n+1)) And _
isPrime((n*n*n)+(n+1)) And isPrime((n^4)+(n+1))
End Function
 
Dim As UintegerMpz_ptr nn2 = 1,Allocate cont = 1(Len(__mpz_struct))
Dim As DoubleMpz_ptr t0n3 = TimerAllocate (Len(__mpz_struct))
Dim As Mpz_ptr n4 = Allocate (Len(__mpz_struct))
Print "First fifty quad-power prime seeds:"
Mpz_init(n2) : Mpz_init(n3) : Mpz_init(n4)
While cont < 50
 
If isQuadPowerPrime(n) Then
Dim As ULongInt i, j
Print Using "###,###"; n;
ReDim As boolean sieve(sieve_max)
If cont Mod 10 = 0 Then Print
 
cont += 1
' default value on initialization is FALSE
sieve(2) = TRUE
' set all odd numbers to TRUE
For i = 3 To sieve_max Step 2
sieve(i) = TRUE
Next
For i = 3 To Sqr(sieve_max) Step 2
If sieve(i) = TRUE Then
For j = i * i To sieve_max Step i * 2
sieve(j) = FALSE
Next
End If
Next
 
Dim As ULongInt n, count, k
Dim As LongInt si = 15
 
Print "The first fifty quad-power prime seeds are:"
While count < 50
n += 1
k = n +1
If sieve(n + k) Then ' skip if n + k is not prime
Mpz_ui_pow_ui(n4, n , 4)
Mpz_add_ui(n4, n4, k)
If Mpz_probab_prime_p(n4, si) < 1 Then Continue While ' skip if not prime
Mpz_ui_pow_ui(n3, n, 3)
Mpz_add_ui(n3, n3, k)
If Mpz_probab_prime_p(n3, si) < 1 Then Continue While ' skip if not prime
Mpz_ui_pow_ui(n2, n, 2)
Mpz_add_ui(n2, n2, k)
If Mpz_probab_prime_p(n2, si) >= 1 Then ' if prime then print n
Print Using "########"; n;
count += 1
If (count Mod 10) = 0 Then Print
End If
End If
Wend
Print: Print Timer - t0
 
Dim As ULongInt m = 1, million = 1000000
Print !"\nFirst quad-power prime seed greater than:"
 
Dim As Uinteger m = 1, c = 50
Print !"\n\nFirst quad-power prime seed greater than:"
Do
While m < 11
If isQuadPowerPrime(n) Then
cn += 1
k If= n > m * 1e6 Then+1
If sieve(n + k) Then ' skip Printif Usingn "+ ## millionk is thenot ###: ##########"; m; c; nprime
Mpz_ui_pow_ui(n4, n , m += 14)
Mpz_add_ui(n4, n4, k)
If m = 11 Then Exit Do
If Mpz_probab_prime_p(n4, si) < 1 Then Continue While ' skip if not prime
Mpz_ui_pow_ui(n3, n, 3)
Mpz_add_ui(n3, n3, k)
If Mpz_probab_prime_p(n3, si) < 1 Then Continue While ' skip if not prime
Mpz_ui_pow_ui(n2, n, 2)
Mpz_add_ui(n2, n2, k)
If Mpz_probab_prime_p(n2, si) >= 1 Then
count += 1
If n > million Then
Print Using " ## million is #########, at index ### "; m; n; count
m += 1
million = m * 1000000
End If
End If
End If
Wend
n += 1
 
Loop
Mpz_clear(n4) : Mpz_clear(n3) : Mpz_clear(n2)
 
 
' empty keyboard buffer
While InKey <> "" : Wend
Print : Print "hit any key to end program"
Sleep
End</syntaxhighlight>
{{out}}
<pre>The first fifty quad-power prime seeds are:
1 2 5 6 69 131 426 1665 2129 2696
5250 7929 9689 13545 14154 14286 16434 19760 25739 27809
29631 36821 41819 46619 48321 59030 60500 61955 62321 73610
77685 79646 80535 82655 85251 86996 91014 96566 97739 105939
108240 108681 119754 122436 123164 126489 140636 150480 153179 163070
 
 
First quad-power prime seed greater than:
Sleep</syntaxhighlight>
1 million is 1,009,286 at index 141
2 million is 2,015,496 at index 234
3 million is 3,005,316 at index 319
4 million is 4,004,726 at index 383
5 million is 5,023,880 at index 452
6 million is 6,000,554 at index 514
7 million is 7,047,129 at index 567
8 million is 8,005,710 at index 601
9 million is 9,055,151 at index 645
10 million is 10,023,600 at index 701</pre>
 
=={{header|Go}}==
457

edits