Carmichael 3 strong pseudoprimes: Difference between revisions

m
→‎{{header|RPL}}: tweaked the code
m (syntax highlighting fixup automation)
m (→‎{{header|RPL}}: tweaked the code)
 
(9 intermediate revisions by 8 users not shown)
Line 33:
[[Chernick's Carmichael numbers]]
<br><br>
 
=={{header|11l}}==
{{trans|D}}
<syntaxhighlight lang="11l">F mod_(n, m)
R ((n % m) + m) % m
Line 88 ⟶ 87:
61 x 3361 x 4021
</pre>
 
=={{header|Ada}}==
 
Uses the Miller_Rabin package from
[[Miller-Rabin primality test#ordinary integers]].
<syntaxhighlight lang=Ada"ada">with Ada.Text_IO, Miller_Rabin;
 
procedure Nemesis is
Line 147 ⟶ 145:
61 * 241 * 421 = 6189121
61 * 3361 * 4021 = 824389441</pre>
 
=={{header|ALGOL 68}}==
Uses the Sieve of Eratosthenes code from the Smith Numbers task with an increased upper-bound (included here for convenience).
<syntaxhighlight lang="algol68"># sieve of Eratosthene: sets s[i] to TRUE if i is prime, FALSE otherwise #
PROC sieve = ( REF[]BOOL s )VOID:
BEGIN
Line 182 ⟶ 179:
IF is prime[ prime3 ] THEN
IF ( prime2 * prime3 ) MOD ( prime1 - 1 ) = 1 THEN
print( ( whole( prime1, 0 ), " ", whole( prime2, 0 ), " ", whole( prime3, 0 ), newline ) );
print( ( newline ) )
FI
FI
Line 221 ⟶ 219:
61 3361 4021
</pre>
 
=={{header|Arturo}}==
<syntaxhighlight lang="arturo">printOneLine: function [a,b,c,d]->
print [
pad to :string a 3 "x"
pad to :string b 5 "x"
pad to :string c 5 "="
pad to :string d 10
]
 
2..61 | select => prime?
| loop 'p ->
loop 2..p 'h3 [
g: h3 + p
loop 1..g 'd ->
if and? -> zero? mod g*p-1 d
-> zero? mod d+p*p h3 [
 
q: 1 + ((p-1)*g)/d
 
if prime? q [
r: 1 + (p * q) / h3
 
if and? [prime? r]
[one? (q*r) % p-1]->
printOneLine p q r (p*q*r)
]
]
]</syntaxhighlight>
 
{{out}}
 
<pre> 3 x 11 x 17 = 561
3 x 3 x 5 = 45
5 x 29 x 73 = 10585
5 x 5 x 13 = 325
5 x 17 x 29 = 2465
5 x 13 x 17 = 1105
7 x 19 x 67 = 8911
7 x 31 x 73 = 15841
7 x 13 x 31 = 2821
7 x 23 x 41 = 6601
7 x 7 x 13 = 637
7 x 73 x 103 = 52633
7 x 13 x 19 = 1729
11 x 11 x 61 = 7381
11 x 11 x 41 = 4961
11 x 11 x 31 = 3751
13 x 61 x 397 = 314821
13 x 37 x 241 = 115921
13 x 97 x 421 = 530881
13 x 37 x 97 = 46657
13 x 37 x 61 = 29341
17 x 41 x 233 = 162401
17 x 17 x 97 = 28033
17 x 353 x 1201 = 7207201
19 x 43 x 409 = 334153
19 x 19 x 181 = 65341
19 x 19 x 73 = 26353
19 x 19 x 37 = 13357
19 x 199 x 271 = 1024651
23 x 23 x 89 = 47081
23 x 23 x 67 = 35443
23 x 199 x 353 = 1615681
29 x 29 x 421 = 354061
29 x 113 x 1093 = 3581761
29 x 29 x 281 = 236321
29 x 197 x 953 = 5444489
31 x 991 x 15361 = 471905281
31 x 61 x 631 = 1193221
31 x 151 x 1171 = 5481451
31 x 31 x 241 = 231601
31 x 61 x 271 = 512461
31 x 61 x 211 = 399001
31 x 271 x 601 = 5049001
31 x 31 x 61 = 58621
31 x 181 x 331 = 1857241
37 x 109 x 2017 = 8134561
37 x 73 x 541 = 1461241
37 x 613 x 1621 = 36765901
37 x 73 x 181 = 488881
37 x 37 x 73 = 99937
37 x 73 x 109 = 294409
41 x 1721 x 35281 = 2489462641
41 x 881 x 12041 = 434932961
41 x 41 x 281 = 472361
41 x 41 x 241 = 405121
41 x 101 x 461 = 1909001
41 x 241 x 761 = 7519441
41 x 241 x 521 = 5148001
41 x 73 x 137 = 410041
41 x 61 x 101 = 252601
43 x 631 x 13567 = 368113411
43 x 271 x 5827 = 67902031
43 x 127 x 2731 = 14913991
43 x 43 x 463 = 856087
43 x 127 x 1093 = 5968873
43 x 211 x 757 = 6868261
43 x 631 x 1597 = 43331401
43 x 127 x 211 = 1152271
43 x 211 x 337 = 3057601
43 x 433 x 643 = 11972017
43 x 547 x 673 = 15829633
43 x 3361 x 3907 = 564651361
47 x 47 x 277 = 611893
47 x 47 x 139 = 307051
47 x 3359 x 6073 = 958762729
47 x 1151 x 1933 = 104569501
47 x 3727 x 5153 = 902645857
53 x 53 x 937 = 2632033
53 x 157 x 2081 = 17316001
53 x 79 x 599 = 2508013
53 x 53 x 313 = 879217
53 x 157 x 521 = 4335241
53 x 53 x 157 = 441013
59 x 59 x 1741 = 6060421
59 x 59 x 349 = 1214869
59 x 59 x 233 = 811073
59 x 1451 x 2089 = 178837201
61 x 421 x 12841 = 329769721
61 x 181 x 5521 = 60957361
61 x 61 x 1861 = 6924781
61 x 1301 x 19841 = 1574601601
61 x 277 x 2113 = 35703361
61 x 181 x 1381 = 15247621
61 x 541 x 3001 = 99036001
61 x 661 x 2521 = 101649241
61 x 271 x 571 = 9439201
61 x 241 x 421 = 6189121
61 x 3361 x 4021 = 824389441</pre>
 
=={{header|AWK}}==
<syntaxhighlight lang=AWK"awk">
# syntax: GAWK -f CARMICHAEL_3_STRONG_PSEUDOPRIMES.AWK
# converted from C
Line 342 ⟶ 470:
</pre>
 
=={{header|BASIC}}==
 
==={{header|BASIC256}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang=BASIC256"vbnet">for i = 3 to max_sieve step 2
for i = 3 to max_sieve step 2
isprime[i] = 1
next i
Line 380 ⟶ 507:
for i = 2 to 61
call carmichael3(i)
next i
end</syntaxhighlight>
 
==={{header|Chipmunk Basic}}===
{{trans|FreeBASIC}}
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="vbnet">100 cls
110 max_sieve = 10000000 ' 10^7
120 dim isprime(max_sieve)
130 sub carmichael3(p1)
140 if isprime(p1) = 0 then goto 440
150 for h3 = 1 to p1-1
160 t1 = (h3+p1)*(p1-1)
170 t2 = (-p1*p1) mod h3
180 if t2 < 0 then t2 = t2+h3
190 for d = 1 to h3+p1-1
200 if t1 mod d = 0 and t2 = (d mod h3) then
210 p2 = 1+int(t1/d)
220 if isprime(p2) = 0 then goto 270
230 p3 = 1+int(p1*p2/h3)
240 if isprime(p3) = 0 or ((p2*p3) mod (p1-1)) <> 1 then goto 270
250 print format$(p1,"###");" * ";format$(p2,"####");" * ";format$(p3,"#####")
260 endif
270 next d
280 next h3
290 end sub
300 'set up sieve
310 for i = 3 to max_sieve step 2
320 isprime(i) = 1
330 next i
340 isprime(2) = 1
350 for i = 3 to sqr(max_sieve) step 2
360 if isprime(i) = 1 then
370 for j = i*i to max_sieve step i*2
380 isprime(j) = 0
390 next j
400 endif
410 next i
420 for i = 2 to 61
430 carmichael3(i)
440 next i
450 end</syntaxhighlight>
 
==={{header|FreeBASIC}}===
<syntaxhighlight lang="freebasic">' version 17-10-2016
' compile with: fbc -s console
 
' using a sieve for finding primes
 
#Define max_sieve 10000000 ' 10^7
ReDim Shared As Byte isprime(max_sieve)
 
' translated the pseudo code to FreeBASIC
Sub carmichael3(p1 As Integer)
 
If isprime(p1) = 0 Then Exit Sub
 
Dim As Integer h3, d, p2, p3, t1, t2
 
For h3 = 1 To p1 -1
t1 = (h3 + p1) * (p1 -1)
t2 = (-p1 * p1) Mod h3
If t2 < 0 Then t2 = t2 + h3
For d = 1 To h3 + p1 -1
If t1 Mod d = 0 And t2 = (d Mod h3) Then
p2 = 1 + (t1 \ d)
If isprime(p2) = 0 Then Continue For
p3 = 1 + (p1 * p2 \ h3)
If isprime(p3) = 0 Or ((p2 * p3) Mod (p1 -1)) <> 1 Then Continue For
Print Using "### * #### * #####"; p1; p2; p3
End If
Next d
Next h3
End Sub
 
' ------=< MAIN >=------
 
Dim As UInteger i, j
 
'set up sieve
For i = 3 To max_sieve Step 2
isprime(i) = 1
Next i
 
isprime(2) = 1
For i = 3 To Sqr(max_sieve) Step 2
If isprime(i) = 1 Then
For j = i * i To max_sieve Step i * 2
isprime(j) = 0
Next j
End If
Next i
 
For i = 2 To 61
carmichael3(i)
Next i
 
' empty keyboard buffer
While InKey <> "" : Wend
Print : Print "hit any key to end program"
Sleep
End</syntaxhighlight>
{{out}}
<pre> 3 * 11 * 17
5 * 29 * 73
5 * 17 * 29
5 * 13 * 17
7 * 19 * 67
7 * 31 * 73
7 * 13 * 31
7 * 23 * 41
7 * 73 * 103
7 * 13 * 19
13 * 61 * 397
13 * 37 * 241
13 * 97 * 421
13 * 37 * 97
13 * 37 * 61
17 * 41 * 233
17 * 353 * 1201
19 * 43 * 409
19 * 199 * 271
23 * 199 * 353
29 * 113 * 1093
29 * 197 * 953
31 * 991 * 15361
31 * 61 * 631
31 * 151 * 1171
31 * 61 * 271
31 * 61 * 211
31 * 271 * 601
31 * 181 * 331
37 * 109 * 2017
37 * 73 * 541
37 * 613 * 1621
37 * 73 * 181
37 * 73 * 109
41 * 1721 * 35281
41 * 881 * 12041
41 * 101 * 461
41 * 241 * 761
41 * 241 * 521
41 * 73 * 137
41 * 61 * 101
43 * 631 * 13567
43 * 271 * 5827
43 * 127 * 2731
43 * 127 * 1093
43 * 211 * 757
43 * 631 * 1597
43 * 127 * 211
43 * 211 * 337
43 * 433 * 643
43 * 547 * 673
43 * 3361 * 3907
47 * 3359 * 6073
47 * 1151 * 1933
47 * 3727 * 5153
53 * 157 * 2081
53 * 79 * 599
53 * 157 * 521
59 * 1451 * 2089
61 * 421 * 12841
61 * 181 * 5521
61 * 1301 * 19841
61 * 277 * 2113
61 * 181 * 1381
61 * 541 * 3001
61 * 661 * 2521
61 * 271 * 571
61 * 241 * 421
61 * 3361 * 4021</pre>
 
==={{header|Gambas}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vbnet">Public isprime[1000000] As Integer
 
Public Sub Main()
Dim max_sieve As Integer = 1000000
Dim i As Integer, j As Integer
'set up sieve
For i = 3 To max_sieve Step 2
isprime[i] = 1
Next
isprime[2] = 1
For i = 3 To Sqr(max_sieve) Step 2
If isprime[i] = 1 Then
For j = i * i To max_sieve Step i * 2
isprime[j] = 0
Next
End If
Next
For i = 2 To 61
If isprime[i] <> 0 Then carmichael3(i)
Next
End
 
Sub carmichael3(p1 As Integer)
Dim h3 As Integer, d As Integer
Dim p2 As Integer, p3 As Integer, t1 As Integer, t2 As Integer
For h3 = 1 To p1 - 1
t1 = (h3 + p1) * (p1 - 1)
t2 = (-p1 * p1) Mod h3
If t2 < 0 Then t2 = t2 + h3
For d = 1 To h3 + p1 - 1
If t1 Mod d = 0 And t2 = (d Mod h3) Then
p2 = 1 + (t1 \ d)
If isprime[p2] = 0 Then Continue
p3 = 1 + ((p1 * p2) \ h3)
If isprime[p3] = 0 Or ((p2 * p3) Mod (p1 - 1)) <> 1 Then Continue
Print Format$(p1, "###"); " * "; Format$(p2, "####"); " * "; Format$(p3, "#####")
End If
Next
Next
End Sub</syntaxhighlight>
 
==={{header|Yabasic}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vbnet">max_sieve = 1e7
dim isprime(max_sieve)
 
//set up sieve
for i = 3 to max_sieve step 2
isprime(i) = 1
next i
 
isprime(2) = 1
for i = 3 to sqrt(max_sieve) step 2
if isprime(i) = 1 then
for j = i * i to max_sieve step i * 2
isprime(j) = 0
next j
fi
next i
 
for i = 2 to 61
carmichael3(i)
next i
end
</syntaxhighlight>
sub carmichael3(p1)
local h3, d, p2, p3, t1, t2
 
if isprime(p1) = 0 return
for h3 = 1 to p1 -1
t1 = (h3 + p1) * (p1 -1)
t2 = mod((-p1 * p1), h3)
if t2 < 0 t2 = t2 + h3
for d = 1 to h3 + p1 -1
if mod(t1, d) = 0 and t2 = mod(d, h3) then
p2 = 1 + int(t1 / d)
if isprime(p2) = 0 continue
p3 = 1 + int(p1 * p2 / h3)
if isprime(p3) = 0 or mod((p2 * p3), (p1 -1)) <> 1 continue
print p1 using ("###"), " * ", p2 using ("####"), " * ", p3 using ("#####")
fi
next d
next h3
end sub</syntaxhighlight>
 
==={{header|ZX Spectrum Basic}}===
{{trans|C}}
<syntaxhighlight lang="zxbasic">10 FOR p=2 TO 61
20 LET n=p: GO SUB 1000
30 IF NOT n THEN GO TO 200
40 FOR h=1 TO p-1
50 FOR d=1 TO h-1+p
60 IF NOT (FN m((h+p)*(p-1),d)=0 AND FN w(-p*p,h)=FN m(d,h)) THEN GO TO 180
70 LET q=INT (1+((p-1)*(h+p)/d))
80 LET n=q: GO SUB 1000
90 IF NOT n THEN GO TO 180
100 LET r=INT (1+(p*q/h))
110 LET n=r: GO SUB 1000
120 IF (NOT n) OR ((FN m((q*r),(p-1))<>1)) THEN GO TO 180
130 PRINT p;" ";q;" ";r
180 NEXT d
190 NEXT h
200 NEXT p
210 STOP
1000 IF n<4 THEN LET n=(n>1): RETURN
1010 IF (NOT FN m(n,2)) OR (NOT FN m(n,3)) THEN LET n=0: RETURN
1020 LET i=5
1030 IF NOT ((i*i)<=n) THEN LET n=1: RETURN
1040 IF (NOT FN m(n,i)) OR NOT FN m(n,(i+2)) THEN LET n=0: RETURN
1050 LET i=i+6
1060 GO TO 1030
2000 DEF FN m(a,b)=a-(INT (a/b)*b): REM Mod function
2010 DEF FN w(a,b)=FN m(FN m(a,b)+b,b): REM Mod function modified
</syntaxhighlight>
 
=={{header|C}}==
<syntaxhighlight lang=C"c">
#include <stdio.h>
 
Line 454 ⟶ 874:
61 3361 4021
</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <iomanip>
#include <iostream>
 
Line 583 ⟶ 1,002:
61 x 3361 x 4021 = 824389441
</pre>
 
=={{header|Clojure}}==
<syntaxhighlight lang="lisp">
(ns example
(:gen-class))
Line 688 ⟶ 1,106:
 
</pre>
 
=={{header|D}}==
<syntaxhighlight lang="d">enum mod = (in int n, in int m) pure nothrow @nogc=> ((n % m) + m) % m;
 
bool isPrime(in uint n) pure nothrow @nogc {
Line 793 ⟶ 1,210:
61 x 241 x 421
61 x 3361 x 4021</pre>
=={{header|EasyLang}}==
{{trans|C}}
<syntaxhighlight>
func isprim num .
i = 2
while i <= sqrt num
if num mod i = 0
return 0
.
i += 1
.
return 1
.
proc carmichael3 p1 . .
for h3 = 1 to p1 - 1
for d = 1 to h3 + p1 - 1
if (h3 + p1) * (p1 - 1) mod d = 0 and -p1 * p1 mod h3 = d mod h3
p2 = 1 + (p1 - 1) * (h3 + p1) div d
if isprim p2 = 1
p3 = 1 + (p1 * p2 div h3)
if isprim p3 = 1 and (p2 * p3) mod (p1 - 1) = 1
print p1 & " " & p2 & " " & p3
.
.
.
.
.
.
for p1 = 2 to 61
if isprim p1 = 1
carmichael3 p1
.
.
</syntaxhighlight>
 
=={{header|EchoLisp}}==
<syntaxhighlight lang="scheme">
;; charmichaël numbers up to N-th prime ; 61 is 18-th prime
(define (charms (N 18) local: (h31 0) (Prime2 0) (Prime3 0))
Line 812 ⟶ 1,263:
</syntaxhighlight>
{{out}}
<syntaxhighlight lang="scheme">
(charms 3)
💥 561 = 3 x 11 x 17
Line 839 ⟶ 1,290:
=={{header|F_Sharp|F#}}==
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_function Extensible Prime Generator (F#)]
<syntaxhighlight lang="fsharp">
// Carmichael Number . Nigel Galloway: November 19th., 2017
let fN n = Seq.collect ((fun g->(Seq.map(fun e->(n,1+(n-1)*(n+g)/e,g,e))){1..(n+g-1)})){2..(n-1)}
Line 921 ⟶ 1,372:
61 x 3361 x 4021 = 824389441
</pre>
 
=={{header|Factor}}==
Note the use of <code>rem</code> instead of <code>mod</code> when the remainder should always be positive.
<syntaxhighlight lang="factor">USING: formatting kernel locals math math.primes math.ranges
sequences ;
IN: rosetta-code.carmichael
Line 1,019 ⟶ 1,469:
61 3361 4021
</pre>
 
=={{header|Fortran}}==
===Plan===
This is F77 style, and directly translates the given calculation as per ''formula translation''. It turns out that the normal integers suffice for the demonstration, except for just one of the products of the three primes: 41x1721x35281 = 2489462641, which is bigger than 2147483647, the 32-bit limit. Fortunately, INTEGER*8 variables are also available, so the extension is easy. Otherwise, one would have to mess about with using two integers in a bignum style, one holding say the millions, and the second the number up to a million.
===Source===
So, using the double MOD approach (see the ''Discussion'') - which gives the same result for either style of MOD... <syntaxhighlight lang=Fortran"fortran"> LOGICAL FUNCTION ISPRIME(N) !Ad-hoc, since N is not going to be big...
INTEGER N !Despite this intimidating allowance of 32 bits...
INTEGER F !A possible factor.
Line 1,139 ⟶ 1,588:
61 3361 4021 824389441
</pre>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang=freebasic>' version 17-10-2016
' compile with: fbc -s console
 
' using a sieve for finding primes
 
#Define max_sieve 10000000 ' 10^7
ReDim Shared As Byte isprime(max_sieve)
 
' translated the pseudo code to FreeBASIC
Sub carmichael3(p1 As Integer)
 
If isprime(p1) = 0 Then Exit Sub
 
Dim As Integer h3, d, p2, p3, t1, t2
 
For h3 = 1 To p1 -1
t1 = (h3 + p1) * (p1 -1)
t2 = (-p1 * p1) Mod h3
If t2 < 0 Then t2 = t2 + h3
For d = 1 To h3 + p1 -1
If t1 Mod d = 0 And t2 = (d Mod h3) Then
p2 = 1 + (t1 \ d)
If isprime(p2) = 0 Then Continue For
p3 = 1 + (p1 * p2 \ h3)
If isprime(p3) = 0 Or ((p2 * p3) Mod (p1 -1)) <> 1 Then Continue For
Print Using "### * #### * #####"; p1; p2; p3
End If
Next d
Next h3
End Sub
 
 
' ------=< MAIN >=------
 
Dim As UInteger i, j
 
'set up sieve
For i = 3 To max_sieve Step 2
isprime(i) = 1
Next i
 
isprime(2) = 1
For i = 3 To Sqr(max_sieve) Step 2
If isprime(i) = 1 Then
For j = i * i To max_sieve Step i * 2
isprime(j) = 0
Next j
End If
Next i
 
For i = 2 To 61
carmichael3(i)
Next i
 
' empty keyboard buffer
While InKey <> "" : Wend
Print : Print "hit any key to end program"
Sleep
End</syntaxhighlight>
{{out}}
<pre> 3 * 11 * 17
5 * 29 * 73
5 * 17 * 29
5 * 13 * 17
7 * 19 * 67
7 * 31 * 73
7 * 13 * 31
7 * 23 * 41
7 * 73 * 103
7 * 13 * 19
13 * 61 * 397
13 * 37 * 241
13 * 97 * 421
13 * 37 * 97
13 * 37 * 61
17 * 41 * 233
17 * 353 * 1201
19 * 43 * 409
19 * 199 * 271
23 * 199 * 353
29 * 113 * 1093
29 * 197 * 953
31 * 991 * 15361
31 * 61 * 631
31 * 151 * 1171
31 * 61 * 271
31 * 61 * 211
31 * 271 * 601
31 * 181 * 331
37 * 109 * 2017
37 * 73 * 541
37 * 613 * 1621
37 * 73 * 181
37 * 73 * 109
41 * 1721 * 35281
41 * 881 * 12041
41 * 101 * 461
41 * 241 * 761
41 * 241 * 521
41 * 73 * 137
41 * 61 * 101
43 * 631 * 13567
43 * 271 * 5827
43 * 127 * 2731
43 * 127 * 1093
43 * 211 * 757
43 * 631 * 1597
43 * 127 * 211
43 * 211 * 337
43 * 433 * 643
43 * 547 * 673
43 * 3361 * 3907
47 * 3359 * 6073
47 * 1151 * 1933
47 * 3727 * 5153
53 * 157 * 2081
53 * 79 * 599
53 * 157 * 521
59 * 1451 * 2089
61 * 421 * 12841
61 * 181 * 5521
61 * 1301 * 19841
61 * 277 * 2113
61 * 181 * 1381
61 * 541 * 3001
61 * 661 * 2521
61 * 271 * 571
61 * 241 * 421
61 * 3361 * 4021</pre>
 
=={{header|Go}}==
<syntaxhighlight lang="go">package main
 
import "fmt"
Line 1,397 ⟶ 1,715:
61 3361 4021 824389441
</pre>
 
=={{header|Haskell}}==
{{trans|Ruby}}
Line 1,403 ⟶ 1,720:
{{Works with|GHC|7.4.1}}
{{Works with|primes|0.2.1.0}}
<syntaxhighlight lang="haskell">#!/usr/bin/runhaskell
 
import Data.Numbers.Primes
Line 1,493 ⟶ 1,810:
(61,3361,4021)
</pre>
 
=={{header|Icon}} and {{header|Unicon}}==
 
The following works in both languages.
<syntaxhighlight lang="unicon">link "factors"
 
procedure main(A)
Line 1,554 ⟶ 1,870:
->
</pre>
 
=={{header|J}}==
<syntaxhighlight lang=J"j">
q =: (,"0 1~ >:@i.@<:@+/"1)&.>@(,&.>"0 1~ >:@i.)&.>@I.@(1&p:@i.)@>:
f1 =: (0: = {. | <:@{: * 1&{ + {:) *. ((1&{ | -@*:@{:) = 1&{ | {.)
Line 1,636 ⟶ 1,951:
61 3361 4021
</pre>
 
=={{header|Java}}==
{{trans|D}}
<syntaxhighlight lang="java">public class Test {
 
static int mod(int n, int m) {
Line 1,747 ⟶ 2,061:
61 x 241 x 421
61 x 3361 x 4021</pre>
 
=={{header|Julia}}==
This solution is a straightforward implementation of the algorithm of the Jameson paper cited in the task description. Just for fun, I use Julia's capacity to accommodate Unicode identifiers to match some of the paper's symbols to the variables used in the <tt>carmichael</tt> function.
 
'''Function'''
<syntaxhighlight lang="julia">using Primes
 
function carmichael(pmax::Integer)
Line 1,775 ⟶ 2,088:
 
'''Main'''
<syntaxhighlight lang="julia">hi = 61
car = carmichael(hi)
 
Line 1,843 ⟶ 2,156:
 
42 results in total.</pre>
 
=={{header|Kotlin}}==
{{trans|D}}
<syntaxhighlight lang="scala">fun Int.isPrime(): Boolean {
return when {
this == 2 -> true
Line 1,884 ⟶ 2,196:
{{out}}
See D output.
 
=={{header|Lua}}==
<syntaxhighlight lang="lua">local function isprime(n)
if n < 2 then return false end
if n % 2 == 0 then return n==2 end
Line 1,998 ⟶ 2,309:
61 × 3361 × 4021 = 824389441
69 found.</pre>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">Cases[Cases[
Cases[Table[{p1, h3, d}, {p1, Array[Prime, PrimePi@61]}, {h3, 2,
p1 - 1}, {d, 1, h3 + p1 - 1}], {p1_Integer, h3_, d_} /;
Line 2,008 ⟶ 2,318:
p2, 1 + Floor[p1 p2/h3]}], {p1_, p2_, p3_} /;
Mod[p2 p3, p1 - 1] == 1 :> Print[p1, "*", p2, "*", p3]]</syntaxhighlight>
 
=={{header|Nim}}==
{{trans|Vala}} with some modifications
<syntaxhighlight lang="nim">import strformat
 
func isPrime(n: int64): bool =
Line 2,114 ⟶ 2,423:
61 × 3361 × 4021 = 824389441
</pre>
 
=={{header|PARI/GP}}==
<syntaxhighlight lang="parigp">f(p)={
my(v=List(),q,r);
for(h=2,p-1,
Line 2,130 ⟶ 2,438:
{{out}}
<pre>561, 1105, 2465, 10585, 1729, 2821, 6601, 8911, 15841, 52633, 29341, 46657, 115921, 314821, 530881, 162401, 7207201, 334153, 1024651, 1615681, 3581761, 5444489, 399001, 512461, 1193221, 1857241, 5049001, 5481451, 471905281, 294409, 488881, 1461241, 8134561, 36765901, 252601, 410041, 1909001, 5148001, 7519441, 434932961, 2489462641, 1152271, 3057601, 5968873, 6868261, 11972017, 14913991, 15829633, 43331401, 67902031, 368113411, 564651361, 104569501, 902645857, 958762729, 2508013, 4335241, 17316001, 178837201, 6189121, 9439201, 15247621, 35703361, 60957361, 99036001, 101649241, 329769721, 824389441, 1574601601, 10267951, 163954561, 7991602081,</pre>
 
=={{header|Perl}}==
{{libheader|ntheory}}
<syntaxhighlight lang="perl">use ntheory qw/forprimes is_prime vecprod/;
 
forprimes { my $p = $_;
Line 2,162 ⟶ 2,469:
61 x 3361 x 4021 = 824389441
</pre>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang=Phix"phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">count</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
Line 2,204 ⟶ 2,510:
69 Carmichael numbers found
</pre>
 
=={{header|PicoLisp}}==
<syntaxhighlight lang=PicoLisp"picolisp">(de modulo (X Y)
(% (+ Y (% X Y)) Y) )
Line 2,246 ⟶ 2,551:
(bye)</syntaxhighlight>
 
=={{header|PL/I}}==
<syntaxhighlight lang=PL"pl/Ii">Carmichael: procedure options (main, reorder); /* 24 January 2014 */
declare (Prime1, Prime2, Prime3, h3, d) fixed binary (31);
 
Line 2,371 ⟶ 2,675:
61 x 3361 x 4021
</pre>
 
=={{header|Prolog}}==
<syntaxhighlight lang="prolog">
show(Limit) :-
forall(
Line 2,522 ⟶ 2,825:
true.
</pre>
 
=={{header|Python}}==
<syntaxhighlight lang="python">class Isprime():
'''
Extensible sieve of Eratosthenes
Line 2,610 ⟶ 2,912:
(61, 181, 5521), (61, 241, 421), (61, 271, 571), (61, 277, 2113), (61, 421, 12841),
(61, 541, 3001), (61, 661, 2521), (61, 1301, 19841), (61, 3361, 4021)</pre>
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">
#lang racket
(require math)
Line 2,631 ⟶ 2,932:
</syntaxhighlight>
Output:
<syntaxhighlight lang="racket">
(3 11 17 => 561)
(5 29 73 => 10585)
Line 2,695 ⟶ 2,996:
(61 3361 4021 => 824389441)
</syntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2015.12}}
An almost direct translation of the pseudocode. We take the liberty of going up to 67 to show we aren't limited to 32-bit integers. (Raku uses arbitrary precision in any case.)
<syntaxhighlight lang="raku" line>for (2..67).grep: *.is-prime -> \Prime1 {
for 1 ^..^ Prime1 -> \h3 {
my \g = h3 + Prime1;
Line 2,788 ⟶ 3,088:
67 × 331 × 7393 == 163954561
67 × 331 × 463 == 10267951</pre>
 
=={{header|REXX}}==
Note that REXX's version of &nbsp; '''modulus''' &nbsp; (<big><code>'''//'''</code></big>) &nbsp; is really a &nbsp; ''remainder'' &nbsp; function.
Line 2,795 ⟶ 3,094:
 
Some code optimization was done, while not necessary for the small default number ('''61'''), &nbsp; it was significant for larger numbers.
<syntaxhighlight lang="rexx">/*REXX program calculates Carmichael 3─strong pseudoprimes (up to and including N). */
numeric digits 18 /*handle big dig #s (9 is the default).*/
parse arg N .; if N=='' | N=="," then N=61 /*allow user to specify for the search.*/
Line 2,866 ⟶ 3,165:
──────── 8716 Carmichael numbers found.
</pre>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
# Project : Carmichael 3 strong pseudoprimes
 
Line 2,987 ⟶ 3,285:
61 241 421 6189121
61 3361 4021 824389441
</pre>
=={{header|RPL}}==
{{works with|HP|49}}
« { }
3 ROT '''FOR''' p1
2 p1 1 - '''FOR''' h3
1 h3 p1 + 1 - '''FOR''' d
'''IF''' h3 p1 + p1 1 - * d MOD NOT p1 SQ NEG h3 MOD d h3 MOD == AND '''THEN'''
p1 1 - h3 p1 + d IQUOT * 1 +
'''CASE'''
DUP ISPRIME? NOT '''THEN''' DROP '''END'''
p1 OVER * h3 IQUOT 1 +
DUP ISPRIME? NOT '''THEN''' DROP2 '''END'''
DUP2 * p1 1 - MOD 1 ≠ '''THEN''' DROP2 '''END'''
p1 UNROT 3 →LIST 1 →LIST +
'''END'''
'''END'''
'''NEXT'''
'''NEXT'''
p1 NEXTPRIME 1 - 'p1' STO
'''NEXT'''
» '<span style="color:blue">CARMIC</span>' STO
 
61 <span style="color:blue">CARMIC</span>
{{out}}
<pre>
1: { { 3 11 17 } { 5 29 73 } { 5 17 29 } { 5 13 17 } { 7 19 67 } { 7 31 73 } { 7 13 31 } { 7 73 103 } { 7 13 19 } { 13 61 397 } { 13 37 241 } { 13 97 421 } { 13 37 97 } { 13 37 61 } { 17 353 1201 } { 19 199 271 } { 23 199 353 } { 29 113 1093 } { 29 197 953 } { 31 991 15361 } { 31 61 631 } { 31 151 1171 } { 31 61 271 } { 31 61 211 } { 31 271 601 } { 31 181 331 } { 37 109 2017 } { 37 73 541 } { 37 613 1621 } { 37 73 181 } { 37 73 109 } { 41 1721 35281 } { 41 881 12041 } { 41 241 761 } { 41 241 521 } { 43 631 13567 } { 43 127 2731 } { 43 127 1093 } { 43 211 757 } { 43 631 1597 } { 43 127 211 } { 43 211 337 } { 43 547 673 } { 43 3361 3907 } { 47 3359 6073 } { 47 1151 1933 } { 47 3727 5153 } { 53 53 937 } { 53 157 2081 } { 53 157 521 } { 59 1451 2089 } { 61 421 12841 } { 61 181 5521 } { 61 61 1861 } { 61 61 1861 } { 61 181 1381 } { 61 541 3001 } { 61 661 2521 } { 61 241 421 } { 61 3361 4021 } }
</pre>
 
=={{header|Ruby}}==
{{works with|Ruby|1.9}}
<syntaxhighlight lang="ruby"># Generate Charmichael Numbers
 
require 'prime'
Line 3,100 ⟶ 3,425:
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">
fn is_prime(n: i64) -> bool {
if n > 1 {
Line 3,167 ⟶ 3,492:
(61, 3361, 4021)
</pre>
 
=={{header|Seed7}}==
The function [http://seed7.sourceforge.net/algorith/math.htm#isPrime isPrime] below is borrowed from the [http://seed7.sourceforge.net/algorith Seed7 algorithm collection].
 
<syntaxhighlight lang="seed7">$ include "seed7_05.s7i";
const func boolean: isPrime (in integer: number) is func
Line 3,292 ⟶ 3,616:
61 * 3361 * 4021 = 824389441
</pre>
 
=={{header|Sidef}}==
{{trans|Perl}}
<syntaxhighlight lang="ruby">func forprimes(a, b, callback) {
for (a = (a-1 -> next_prime); a <= b; a.next_prime!) {
callback(a)
Line 3,329 ⟶ 3,652:
61 x 3361 x 4021 = 824389441
</pre>
 
=={{header|Swift}}==
 
{{trans|Rust}}
 
<syntaxhighlight lang="swift">import Foundation
 
extension BinaryInteger {
Line 3,417 ⟶ 3,739:
(61, 241, 421)
(61, 3361, 4021)</pre>
 
=={{header|Tcl}}==
Using the primality tester from [[Miller-Rabin primality test#Tcl|the Miller-Rabin task]]...
<syntaxhighlight lang="tcl">proc carmichael {limit {rounds 10}} {
set carmichaels {}
for {set p1 2} {$p1 <= $limit} {incr p1} {
Line 3,444 ⟶ 3,765:
}</syntaxhighlight>
Demonstrating:
<syntaxhighlight lang="tcl">set results [carmichael 61 2]
puts "[expr {[llength $results]/4}] Carmichael numbers found"
foreach {p1 p2 p3 c} $results {
Line 3,522 ⟶ 3,843:
61 x 3361 x 4021 = 824389441
</pre>
 
=={{header|Vala}}==
{{trans|D}}
<syntaxhighlight lang="vala">long mod(long n, long m) {
return ((n % m) + m) % m;
}
Line 3,659 ⟶ 3,979:
61 × 3361 × 4021 = 824389441
</pre>
 
=={{header|Wren}}==
{{trans|Go}}
{{libheader|Wren-fmt}}
{{libheader|Wren-math}}
<syntaxhighlight lang=ecmascript"wren">import "./fmt" for Fmt
import "./math" for Int
 
var mod = Fn.new { |n, m| ((n%m) + m) % m }
Line 3,774 ⟶ 4,093:
=={{header|zkl}}==
Using the Miller-Rabin primality test in lib GMP.
<syntaxhighlight lang="zkl">var BN=Import("zklBigNum"), bi=BN(0); // gonna recycle bi
primes:=T(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61);
var p2,p3;
Line 3,786 ⟶ 4,105:
]];
fcn mod(a,b) { m:=a%b; if(m<0) m+b else m }</syntaxhighlight>
<syntaxhighlight lang="zkl">cs.len().println(" Carmichael numbers found:");
cs.pump(Console.println,fcn([(p1,p2,p3)]){
"%2d * %4d * %5d = %d".fmt(p1,p2,p3,p1*p2*p3) });</syntaxhighlight>
Line 3,805 ⟶ 4,124:
61 * 3361 * 4021 = 824389441
</pre>
 
=={{header|ZX Spectrum Basic}}==
{{trans|C}}
<syntaxhighlight lang=zxbasic>10 FOR p=2 TO 61
20 LET n=p: GO SUB 1000
30 IF NOT n THEN GO TO 200
40 FOR h=1 TO p-1
50 FOR d=1 TO h-1+p
60 IF NOT (FN m((h+p)*(p-1),d)=0 AND FN w(-p*p,h)=FN m(d,h)) THEN GO TO 180
70 LET q=INT (1+((p-1)*(h+p)/d))
80 LET n=q: GO SUB 1000
90 IF NOT n THEN GO TO 180
100 LET r=INT (1+(p*q/h))
110 LET n=r: GO SUB 1000
120 IF (NOT n) OR ((FN m((q*r),(p-1))<>1)) THEN GO TO 180
130 PRINT p;" ";q;" ";r
180 NEXT d
190 NEXT h
200 NEXT p
210 STOP
1000 IF n<4 THEN LET n=(n>1): RETURN
1010 IF (NOT FN m(n,2)) OR (NOT FN m(n,3)) THEN LET n=0: RETURN
1020 LET i=5
1030 IF NOT ((i*i)<=n) THEN LET n=1: RETURN
1040 IF (NOT FN m(n,i)) OR NOT FN m(n,(i+2)) THEN LET n=0: RETURN
1050 LET i=i+6
1060 GO TO 1030
2000 DEF FN m(a,b)=a-(INT (a/b)*b): REM Mod function
2010 DEF FN w(a,b)=FN m(FN m(a,b)+b,b): REM Mod function modified
</syntaxhighlight>
1,150

edits