Curzon numbers: Difference between revisions

m
 
(35 intermediate revisions by 25 users not shown)
Line 30:
<br>
 
 
=={{header|11l}}==
{{trans|C++}}
 
<syntaxhighlight lang="11l">
F is_curzon(n, k)
V m = k * n + 1
R pow(Int64(k), n, m) + 1 == m
 
L(k) [2, 4, 6, 8, 10]
V n = 1
[Int] curzons
L curzons.len < 1000
I is_curzon(n, k)
curzons.append(n)
n++
print(‘Curzon numbers with k = ’k‘:’)
L(c) curzons[0.<50]
V i = L.index
print(f:‘{commatize(c):6}’, end' I (i + 1) % 25 == 0 {"\n"} E ‘’)
print(‘ Thousandth Curzon with k = ’k‘: ’curzons[999]".\n")
</syntaxhighlight>
 
{{out}}
<pre>
Curzon numbers with k = 2:
1 2 5 6 9 14 18 21 26 29 30 33 41 50 53 54 65 69 74 78 81 86 89 90 98
105 113 114 125 134 138 141 146 153 158 165 173 174 186 189 194 198 209 210 221 230 233 245 249 254
Thousandth Curzon with k = 2: 8646.
 
Curzon numbers with k = 4:
1 3 7 9 13 15 25 27 37 39 43 45 49 57 67 69 73 79 87 93 97 99 105 115 127
135 139 153 163 165 169 175 177 183 189 193 199 205 207 213 219 235 249 253 255 265 267 273 277 279
Thousandth Curzon with k = 4: 9375.
 
Curzon numbers with k = 6:
1 6 30 58 70 73 90 101 105 121 125 146 153 166 170 181 182 185 210 233 241 242 266 282 290
322 373 381 385 390 397 441 445 446 450 453 530 557 562 585 593 601 602 605 606 621 646 653 670 685
Thousandth Curzon with k = 6: 20717.
 
Curzon numbers with k = 8:
1 14 35 44 72 74 77 129 131 137 144 149 150 185 200 219 236 266 284 285 299 309 336 357 381
386 390 392 402 414 420 441 455 459 470 479 500 519 527 536 557 582 600 602 617 639 654 674 696 735
Thousandth Curzon with k = 8: 22176.
 
Curzon numbers with k = 10:
1 9 10 25 106 145 190 193 238 253 306 318 349 385 402 462 486 526 610 649 658 678 733 762 810
990 994 1,033 1,077 1,125 1,126 1,141 1,149 1,230 1,405 1,422 1,441 1,485 1,509 1,510 1,513 1,606 1,614 1,630 1,665 1,681 1,690 1,702 1,785 1,837
Thousandth Curzon with k = 10: 46845.
 
</pre>
 
=={{header|ALGOL 68}}==
{{Trans|C++}}
<syntaxhighlight lang="algol68">
BEGIN # find some generalised Curzon numbers - translation of the C++ sample #
PROC modpow = ( LONG INT rqd base, rqd exp, mod )LONG INT:
IF mod = 1
THEN 0
ELSE
LONG INT result := 1;
LONG INT base := rqd base MOD mod;
LONG INT exp := rqd exp;
WHILE exp > 0 DO
IF ODD exp THEN
result TIMESAB base MODAB mod
FI;
base TIMESAB base MODAB mod;
exp OVERAB 2
OD;
result
FI # modpow # ;
 
PROC is curzon = ( LONG INT n, k )BOOL:
BEGIN
LONG INT m = k * n + 1;
modpow( k, n, m ) + 1 = m
END # is curon # ;
 
FOR k FROM 2 BY 2 TO 10 DO
print( ( "Curzon numbers with base ", whole( k, 0 ), ":", newline ) );
INT count := 0, n := 0;
WHILE n +:= 1;
count < 50
DO
IF is curzon( n, k ) THEN
print( ( whole( n, -4 )
, IF ( count +:= 1 ) MOD 10 = 0 THEN newline ELSE " " FI
)
)
FI
OD;
WHILE IF is curzon( n, k ) THEN count +:= 1 FI;
count < 1000
DO
n +:= 1
OD;
print( ( "1000th Curzon number with base ", whole( k, 0 ), ": ", whole( n, 0 ) ) );
print( ( newline, newline ) )
OD
END
</syntaxhighlight>
{{out}}
<pre>
Curzon numbers with base 2:
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
1000th Curzon number with base 2: 8646
 
Curzon numbers with base 4:
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
1000th Curzon number with base 4: 9375
 
Curzon numbers with base 6:
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
1000th Curzon number with base 6: 20717
 
Curzon numbers with base 8:
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
1000th Curzon number with base 8: 22176
 
Curzon numbers with base 10:
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
1000th Curzon number with base 10: 46845
</pre>
 
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">curzon?: function [n,base]->
zero? (inc base^n) % inc base*n
 
Line 63 ⟶ 207:
print ["\n1000th Curzon with base" withBase "=" oneThousandth withBase]
print ""
]</langsyntaxhighlight>
 
{{out}}
Line 111 ⟶ 255:
 
1000th Curzon with base 10 = 46845</pre>
 
=={{header|C}}==
{{trans|C++}}
<syntaxhighlight lang="c">#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <locale.h>
 
uint64_t modPow(uint64_t base, uint64_t exp, uint64_t mod) {
if (mod == 1) return 0;
uint64_t result = 1;
base %= mod;
for (; exp > 0; exp >>= 1) {
if ((exp & 1) == 1) result = (result * base) % mod;
base = (base * base) % mod;
}
return result;
}
 
bool isCurzon(uint64_t n, uint64_t k) {
const uint64_t r = k * n;
return modPow(k, n, r+1) == r;
}
 
int main() {
uint64_t k, n, count;
setlocale(LC_NUMERIC, "");
for (k = 2; k <= 10; k += 2) {
printf("Curzon numbers with base %ld:\n", k);
for (n = 1, count = 0; count < 50; ++n) {
if (isCurzon(n, k)) {
printf("%4ld ", n);
if (++count % 10 == 0) printf("\n");
}
}
for (;;) {
if (isCurzon(n, k)) ++count;
if (count == 1000) break;
++n;
}
printf("1,000th Curzon number with base %ld: %'ld\n\n", k, n);
}
return 0;
}</syntaxhighlight>
 
{{out}}
<pre>
Curzon numbers with base 2:
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
1,000th Curzon number with base 2: 8,646
 
Curzon numbers with base 4:
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
1,000th Curzon number with base 4: 9,375
 
Curzon numbers with base 6:
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
1,000th Curzon number with base 6: 20,717
 
Curzon numbers with base 8:
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
1,000th Curzon number with base 8: 22,176
 
Curzon numbers with base 10:
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
1,000th Curzon number with base 10: 46,845
</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <cstdint>
{{libheader|GMP}}
<lang cpp>#include <iomanip>
#include <iostream>
#include <vector>
 
uint64_t modpow(uint64_t base, uint64_t exp, uint64_t mod) {
#include <gmpxx.h>
if (mod == 1)
return 0;
uint64_t result = 1;
base %= mod;
for (; exp > 0; exp >>= 1) {
if ((exp & 1) == 1)
result = (result * base) % mod;
base = (base * base) % mod;
}
return result;
}
 
bool is_curzon(intuint64_t n, intuint64_t k) {
const uint64_t r = k * n;
mpz_class p;
return modpow(k, n, r + 1) == r;
mpz_ui_pow_ui(p.get_mpz_t(), k, n);
return (p + 1) % (k * n + 1) == 0;
}
 
int main() {
for (intuint64_t k = 2; k <= 10; k += 2) {
std::cout << "Curzon numbers with base " << k << ":\n";
intuint64_t count = 0, n = 1;
for (; count < 50; ++n) {
if (is_curzon(n, k)) {
Line 147 ⟶ 388:
}
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 192 ⟶ 433:
 
</pre>
 
=={{header|EasyLang}}==
{{trans|FreeBASIC}}
<syntaxhighlight>
func pow_mod b power modulus .
x = 1
while power > 0
if power mod 2 = 1
x = x * b mod modulus
.
b = b * b mod modulus
power = power div 2
.
return x
.
for k = 2 step 2 to 10
numfmt 0 0
print "First 50 Curzon numbers using a base of " & k & ":"
numfmt 0 4
n = 1
count = 0
repeat
m = k * n + 1
p = pow_mod k n m + 1
if p = m
count += 1
if count <= 50
write " " & n
if count mod 9 = 0
print ""
.
.
.
until count = 1000
n += 1
.
print "" ; print "One thousandth: " & n
print ""
.
</syntaxhighlight>
 
=={{header|Factor}}==
{{works with|Factor|0.99 2022-04-03}}
<langsyntaxhighlight lang="factor">USING: grouping interpolate io kernel make math math.functions
prettyprint ranges sequences ;
 
Line 209 ⟶ 490:
curzon 10 group simple-table. ;
 
2 10 2 <range> [ curzon. nl ] each</langsyntaxhighlight>
{{out}}
<pre>
Line 247 ⟶ 528:
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
</pre>
 
=={{header|FreeBASIC}}==
===Normal basic===
<syntaxhighlight lang="freebasic">' limit: k * n +1 must be smaller then 2^32-1
 
Function pow_mod(b As ULongInt, power As ULongInt, modulus As ULongInt) As ULongInt
' returns b ^ power mod modulus
Dim As ULongInt x = 1
 
While power > 0
If (power And 1) = 1 Then
x = (x * b) Mod modulus
End If
b = (b * b) Mod modulus
power = power Shr 1
Wend
 
Return x
 
End Function
 
 
For k As ULongInt= 2 To 10 Step 2
Print "The first 50 Curzon numbers using a base of "; k; ":"
Dim As ULongInt count, n = 1, p, m
 
Do
m = k * n +1
p = pow_mod(k, n ,m) +1
If p = m Then
count += 1
If count <= 50 Then
Print Using "#####"; n;
If (count Mod 10) = 0 Then Print
ElseIf count = 1000 Then
Print : Print "One thousandth: "; n
Print : Print
Exit Do
End If
End If
n += 1
Loop
 
Next
Sleep</syntaxhighlight>{{out}}<pre>The first 50 Curzon numbers using a base of 2:
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
 
One thousandth: 8646
 
 
The first 50 Curzon numbers using a base of 4:
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
 
One thousandth: 9375
 
 
The first 50 Curzon numbers using a base of 6:
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
 
One thousandth: 20717
 
 
The first 50 Curzon numbers using a base of 8:
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
 
One thousandth: 22176
 
 
The first 50 Curzon numbers using a base of 10:
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
 
One thousandth: 46845</pre>
 
===GMP version===
{{libheader|GMP}}
<syntaxhighlight lang="freebasic">#include once "gmp.bi"
 
Dim As Longint t = Len(__mpz_struct)
Dim As mpz_ptr pow = Allocate(t)
Dim As mpz_ptr z = Allocate(t)
mpz_init(pow): mpz_init(z)
 
For k As Uinteger = 2 To 10 Step 2
Print "The first 50 Curzon numbers using a base of"; k; ":"
Dim As Integer count = 0, n = 1
mpz_set_si(pow,k)
Do
mpz_add_ui(z,pow,1)
Dim As Integer d = k*n + 1
If mpz_divisible_ui_p(z,d) Then
count += 1
If count <= 50 Then
Print Using "#####"; n
If (count Mod 25) = 0 Then Print
Elseif count=1000 Then
Print "One thousandth: "; n
Print : Print
Exit Do
End If
End If
n += 1
mpz_mul_si(pow,pow,k)
Loop
Next k
Sleep</syntaxhighlight>
 
=={{header|Go}}==
{{trans|Wren}}
Based on Version 1.
<lang go>package main
<syntaxhighlight lang="go">package main
 
import (
Line 296 ⟶ 703:
fmt.Println()
}
}</langsyntaxhighlight>
 
{{out}}
Line 344 ⟶ 751:
 
One thousandth: 46845
</pre>
 
=={{header|Haskell}}==
<syntaxhighlight lang=Haskell>
import Data.List.Split ( chunksOf )
 
isGeneralizedCurzon :: Integer -> Integer -> Bool
isGeneralizedCurzon base n = mod ( base ^ n + 1 ) ( base * n + 1 ) == 0
 
solution :: Integer -> [Integer]
solution base = take 50 $ filter (\i -> isGeneralizedCurzon base i ) [1..]
 
printChunk :: [Integer] -> String
printChunk chunk = foldl1 (++) $ map (\i -> (take ( 4 - (length $ show i) )
$ repeat ' ' ) ++ show i ++ " ") chunk
 
prettyPrint :: [Integer] -> [String]
prettyPrint list = map printChunk $ chunksOf 10 list
 
oneThousandth :: Integer -> Integer
oneThousandth base = last $ take 950 $ filter (\i -> isGeneralizedCurzon base i )
[(last $ solution base) + 1 ..]
 
printBlock :: Integer -> [String]
printBlock base = ["first 50 Curzon numbers using a base of " ++ show base ++ " :"]
++ (prettyPrint $ solution base) ++ ["one thousandth at base " ++ show base ++
": " ++ (show $ oneThousandth base)] ++ [take 50 $ repeat '-']
main :: IO ( )
main = do
blocks <- return $ concat $ map (\i -> printBlock i ) [2 , 4 , 6 , 8 , 10]
mapM_ putStrLn blocks</syntaxhighlight>
 
{{out}}
<pre>first 50 Curzon numbers using a base of 2 :
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
one thousandth at base 2: 8646
--------------------------------------------------
first 50 Curzon numbers using a base of 4 :
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
one thousandth at base 4: 9375
--------------------------------------------------
first 50 Curzon numbers using a base of 6 :
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
one thousandth at base 6: 20717
--------------------------------------------------
first 50 Curzon numbers using a base of 8 :
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
one thousandth at base 8: 22176
--------------------------------------------------
first 50 Curzon numbers using a base of 10 :
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
one thousandth at base 10: 46845
--------------------------------------------------
</pre>
 
=={{header|J}}==
A simple test for whether a number is a (generalized) Curzon number is:
<syntaxhighlight lang="j">isCurzon =: 2&$: : (0 = * |&:>: ^)</syntaxhighlight>
Here, the monadic case uses 2 as the left argument for the dyadic case, which handles generalized Curzon numbers.
 
However, this is inefficient for large numbers, due to it explicitly exponentiating.
Since we test the remainder immediately after, we can use a special combination instead,
 
<syntaxhighlight lang="j">modpow =: {{ m&|@^ }}
isCurzon =: {{
z =: >: x * y
z = >: x z modpow y
}}</syntaxhighlight>
 
This avoids performing the large exponentiation, which is significantly faster.
For generating the results:
 
<syntaxhighlight lang="j">generateCurzons =: {{
found =. i. 0x
current =. 0x
while. 1000 > # found do.
if. y isCurzon current do. found =. found , current end.
current =. >: current
end.
y ; (5 10 $ found) ; {: found
}}
 
('Base';'First 50';'1000th') , generateCurzons"0 +:>:i.5</syntaxhighlight>
 
{{out}}
<pre>
+----+-------------------------------------------------+------+
|Base|First 50 |1000th|
+----+-------------------------------------------------+------+
|2 | 1 2 5 6 9 14 18 21 26 29 |8646 |
| | 30 33 41 50 53 54 65 69 74 78 | |
| | 81 86 89 90 98 105 113 114 125 134 | |
| |138 141 146 153 158 165 173 174 186 189 | |
| |194 198 209 210 221 230 233 245 249 254 | |
+----+-------------------------------------------------+------+
|4 | 1 3 7 9 13 15 25 27 37 39 |9375 |
| | 43 45 49 57 67 69 73 79 87 93 | |
| | 97 99 105 115 127 135 139 153 163 165 | |
| |169 175 177 183 189 193 199 205 207 213 | |
| |219 235 249 253 255 265 267 273 277 279 | |
+----+-------------------------------------------------+------+
|6 | 1 6 30 58 70 73 90 101 105 121 |20717 |
| |125 146 153 166 170 181 182 185 210 233 | |
| |241 242 266 282 290 322 373 381 385 390 | |
| |397 441 445 446 450 453 530 557 562 585 | |
| |593 601 602 605 606 621 646 653 670 685 | |
+----+-------------------------------------------------+------+
|8 | 1 14 35 44 72 74 77 129 131 137 |22176 |
| |144 149 150 185 200 219 236 266 284 285 | |
| |299 309 336 357 381 386 390 392 402 414 | |
| |420 441 455 459 470 479 500 519 527 536 | |
| |557 582 600 602 617 639 654 674 696 735 | |
+----+-------------------------------------------------+------+
|10 | 1 9 10 25 106 145 190 193 238 253|46845 |
| | 306 318 349 385 402 462 486 526 610 649| |
| | 658 678 733 762 810 990 994 1033 1077 1125| |
| |1126 1141 1149 1230 1405 1422 1441 1485 1509 1510| |
| |1513 1606 1614 1630 1665 1681 1690 1702 1785 1837| |
+----+-------------------------------------------------+------+
</pre>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
 
public final class CurzonNumbers {
 
public static void main(String[] aArgs) {
for ( int k = 2; k <= 10; k += 2 ) {
System.out.println("Generalised Curzon numbers with base " + k + ":");
int n = 1;
int count = 0;
while ( count < 50 ) {
if ( isGeneralisedCurzonNumber(k, n) ) {
System.out.print(String.format("%4d%s", n, ( ++count % 10 == 0 ? "\n" : " " )));
}
n += 1;
}
while ( count < 1_000 ) {
if ( isGeneralisedCurzonNumber(k, n) ) {
count += 1;
}
n += 1;
}
System.out.println("1,000th Generalised Curzon number with base " + k + ": " + ( n - 1 ));
System.out.println();
}
}
private static boolean isGeneralisedCurzonNumber(int aK, int aN) {
final long r = aK * aN;
return modulusPower(aK, aN, r + 1) == r;
}
private static long modulusPower(long aBase, long aExponent, long aModulus) {
if ( aModulus == 1 ) {
return 0;
}
aBase %= aModulus;
long result = 1;
while ( aExponent > 0 ) {
if ( ( aExponent & 1 ) == 1 ) {
result = ( result * aBase ) % aModulus;
}
aBase = ( aBase * aBase ) % aModulus;
aExponent >>= 1;
}
return result;
}
 
}
</syntaxhighlight>
{{ out }}
<pre>
Generalised Curzon numbers with base 2:
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
1,000th Generalised Curzon number with base 2: 8646
 
Generalised Curzon numbers with base 4:
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
1,000th Generalised Curzon number with base 4: 9375
 
Generalised Curzon numbers with base 6:
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
1,000th Generalised Curzon number with base 6: 20717
 
Generalised Curzon numbers with base 8:
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
1,000th Generalised Curzon number with base 8: 22176
 
Generalised Curzon numbers with base 10:
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
1,000th Generalised Curzon number with base 10: 46845
</pre>
 
Line 354 ⟶ 996:
 
'''Preliminaries'''
<langsyntaxhighlight lang="jq"># To take advantage of gojq's arbitrary-precision integer arithmetic:
def power($b): . as $in | reduce range(0;$b) as $i (1; . * $in);
 
Line 364 ⟶ 1,006:
n;
 
def printRows($m): _nwise($m) | map(lpad(5)) | join("");</langsyntaxhighlight>
 
'''The task'''
<langsyntaxhighlight lang="jq">def isCurzon($n; $k):
($k | power($n) + 1) % ($k * $n + 1) == 0;
 
Line 384 ⟶ 1,026:
"";
printcurzons(2; 10; 1000)</langsyntaxhighlight>
{{out}}
<pre>
Line 415 ⟶ 1,057:
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">isCurzon(n, k) = (BigInt(k)^n + 1) % (k * n + 1) == 0
 
function printcurzons(klow, khigh)
Line 431 ⟶ 1,073:
 
printcurzons(2, 10)
</langsyntaxhighlight>{{out}}
<pre>
Curzon numbers with k = 2:
Line 453 ⟶ 1,095:
990 994 1033 1077 1125 1126 1141 1149 1230 1405 1422 1441 1485 1509 1510 1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
Thousandth Curzon with k = 10: 46845
</pre>
 
=={{header|Lambdatalk}}==
Using Javascript's BigInt.
<syntaxhighlight lang="scheme">
{def is_curzon
{lambda {:n :k}
{= {BI.% {BI.+ {BI.** :k :n} 1}
{BI.+ {BI.* :k :n} 1} } 0}}}
-> is_curzon
 
{def curzon
{lambda {:length :base}
{S.replace \s by space in
{S.brmap {{lambda {:length :base :count :i}
{if {< {A.get 0 :count} :length}
then {if {is_curzon :i :base}
then {{lambda {:a :i} :i}
{A.set! 0 {+ {A.get 0 :count} 1} :count} :i}
else}
else _break_}
} :length :base {A.new 0}}
1 100000 1 }}}}
-> curzon
 
{S.map {lambda {:i}
{div {b First 50 Curzon numbers using a base of :i:}
{div {curzon 50 :i}}}}
{S.serie 2 10 2}}
->
First 50 Curzon numbers using a base of 2:
1 2 5 6 9 14 18 21 26 29 30 33 41 50 53 54 65 69 74 78 81 86 89 90 98 105 113 114 125 134 138 141 146 153 158 165 173 174 186 189 194 198 209 210 221 230 233 245 249 254
First 50 Curzon numbers using a base of 4:
1 3 7 9 13 15 25 27 37 39 43 45 49 57 67 69 73 79 87 93 97 99 105 115 127 135 139 153 163 165 169 175 177 183 189 193 199 205 207 213 219 235 249 253 255 265 267 273 277 279
First 50 Curzon numbers using a base of 6:
1 6 30 58 70 73 90 101 105 121 125 146 153 166 170 181 182 185 210 233 241 242 266 282 290 322 373 381 385 390 397 441 445 446 450 453 530 557 562 585 593 601 602 605 606 621 646 653 670 685
First 50 Curzon numbers using a base of 8:
1 14 35 44 72 74 77 129 131 137 144 149 150 185 200 219 236 266 284 285 299 309 336 357 381 386 390 392 402 414 420 441 455 459 470 479 500 519 527 536 557 582 600 602 617 639 654 674 696 735
First 50 Curzon numbers using a base of 10:
1 9 10 25 106 145 190 193 238 253 306 318 349 385 402 462 486 526 610 649 658 678 733 762 810 990 994 1033 1077 1125 1126 1141 1149 1230 1405 1422 1441 1485 1509 1510 1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
{S.last {curzon 1000 6}} -> 20717 in 272193ms = 4.53655 minutes
 
</syntaxhighlight>
 
=={{header|Maxima}}==
<syntaxhighlight lang="maxima">
/* Predicate function that checks wether a positive integer is generalized k-Curzon number or not */
g_curzonp(n,k):=if mod((k^n)+1,k*n+1)=0 then true$
 
/* Function that returns a list of the first len generalized k-Curzon numbers */
g_curzon_count(len,k):=block(
[i:1,count:0,result:[]],
while count<len do (if g_curzonp(i,k) then (result:endcons(i,result),count:count+1),i:i+1),
result)$
 
/* Test cases */
g_curzon_count(50,2);
g_curzon_count(50,4);
g_curzon_count(50,6);
g_curzon_count(50,8);
g_curzon_count(50,10);
</syntaxhighlight>
{{out}}
<pre>
[1,2,5,6,9,14,18,21,26,29,30,33,41,50,53,54,65,69,74,78,81,86,89,90,98,105,113,114,125,134,138,141,146,153,158,165,173,174,186,189,194,198,209,210,221,230,233,245,249,254]
[1,3,7,9,13,15,25,27,37,39,43,45,49,57,67,69,73,79,87,93,97,99,105,115,127,135,139,153,163,165,169,175,177,183,189,193,199,205,207,213,219,235,249,253,255,265,267,273,277,279]
[1,6,30,58,70,73,90,101,105,121,125,146,153,166,170,181,182,185,210,233,241,242,266,282,290,322,373,381,385,390,397,441,445,446,450,453,530,557,562,585,593,601,602,605,606,621,646,653,670,685]
[1,14,35,44,72,74,77,129,131,137,144,149,150,185,200,219,236,266,284,285,299,309,336,357,381,386,390,392,402,414,420,441,455,459,470,479,500,519,527,536,557,582,600,602,617,639,654,674,696,735]
[1,9,10,25,106,145,190,193,238,253,306,318,349,385,402,462,486,526,610,649,658,678,733,762,810,990,994,1033,1077,1125,1126,1141,1149,1230,1405,1422,1441,1485,1509,1510,1513,1606,1614,1630,1665,1681,1690,1702,1785,1837]
</pre>
 
=={{header|Nim}}==
Nim standard library doesn’t provide a modular power, so we have to define our own function.
<syntaxhighlight lang="Nim">import std/strformat
 
func pow(a, n: Natural; m: Positive): Natural =
var a = a mod m
var n = n
if a > 0:
result = 1
while n > 0:
if (n and 1) != 0:
result = (result * a) mod m
n = n shr 1
a = (a * a) mod m
 
iterator curzonNumbers(k: Positive): Natural =
assert (k and 1) == 0, "base must be even."
var n = 1
while true:
let m = k * n + 1
if pow(k, n, m) + 1 == m:
yield n
inc n
 
### Task ###
for k in countup(2, 10, 2):
echo &"Curzon numbers for k = {k}:"
var count = 0
for n in curzonNumbers(k):
inc count
stdout.write &"{n:>4}"
stdout.write if count mod 10 == 0: '\n' else: ' '
if count == 50: break
echo()
 
### Stretch task ###
for k in countup(2, 10, 2):
var count = 0
for n in curzonNumbers(k):
inc count
if count == 1000:
echo &"1000th Curzon number for k = {k:>2}: {n:>5}"
break
</syntaxhighlight>
{{out}}
<pre>Curzon numbers for k = 2:
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
 
Curzon numbers for k = 4:
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
 
Curzon numbers for k = 6:
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
 
Curzon numbers for k = 8:
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
 
Curzon numbers for k = 10:
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
 
1000th Curzon number for k = 2: 8646
1000th Curzon number for k = 4: 9375
1000th Curzon number for k = 6: 20717
1000th Curzon number for k = 8: 22176
1000th Curzon number for k = 10: 46845
</pre>
 
=={{header|OCaml}}==
<syntaxhighlight lang="ocaml">let modpow m =
let rec loop p b e =
if e land 1 = 0
then if e = 0 then p else loop p (b * b mod m) (e lsr 1)
else loop (p * b mod m) (b * b mod m) (e lsr 1)
in loop 1
 
let is_curzon k n =
let r = k * n in r = modpow (succ r) k n
 
let () =
List.iter (fun x ->
Seq.(ints 0 |> filter (is_curzon x) |> take 50 |> map string_of_int)
|> List.of_seq |> String.concat " " |> Printf.printf "base %u:\n%s\n" x)
[2; 4; 6; 8; 10]
 
let () =
List.iter (fun x ->
Seq.(ints 0 |> filter (is_curzon x) |> drop 999 |> take 1
|> iter (Printf.printf "base %u (1000th): %u\n" x)))
[2; 4; 6; 8; 10]</syntaxhighlight>
<pre>
base 2:
1 2 5 6 9 14 18 21 26 29 30 33 41 50 53 54 65 69 74 78 81 86 89 90 98 105 113 114 125 134 138 141 146 153 158 165 173 174 186 189 194 198 209 210 221 230 233 245 249 254
base 4:
1 3 7 9 13 15 25 27 37 39 43 45 49 57 67 69 73 79 87 93 97 99 105 115 127 135 139 153 163 165 169 175 177 183 189 193 199 205 207 213 219 235 249 253 255 265 267 273 277 279
base 6:
1 6 30 58 70 73 90 101 105 121 125 146 153 166 170 181 182 185 210 233 241 242 266 282 290 322 373 381 385 390 397 441 445 446 450 453 530 557 562 585 593 601 602 605 606 621 646 653 670 685
base 8:
1 14 35 44 72 74 77 129 131 137 144 149 150 185 200 219 236 266 284 285 299 309 336 357 381 386 390 392 402 414 420 441 455 459 470 479 500 519 527 536 557 582 600 602 617 639 654 674 696 735
base 10:
1 9 10 25 106 145 190 193 238 253 306 318 349 385 402 462 486 526 610 649 658 678 733 762 810 990 994 1033 1077 1125 1126 1141 1149 1230 1405 1422 1441 1485 1509 1510 1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
base 2 (1000th): 8646
base 4 (1000th): 9375
base 6 (1000th): 20717
base 8 (1000th): 22176
base 10 (1000th): 46845
</pre>
 
=={{header|Odin}}==
<syntaxhighlight lang="Go">
package curzon_numbers
/* imports */
import "core:c/libc"
import "core:fmt"
/* main block */
main :: proc() {
for k: int = 2; k <= 10; k += 2 {
fmt.println("\nCurzon numbers with base ", k)
count := 0
n: int = 1
for ; count < 50; n += 1 {
if is_curzon(n, k) {
count += 1
libc.printf("%*d ", 4, n)
if (count) % 10 == 0 {
fmt.printf("\n")
}
}
}
for {
if is_curzon(n, k) {
count += 1}
if count == 1000 {
break}
n += 1
}
libc.printf("1000th Curzon number with base %d: %d \n", k, n)
}
}
/* definitions */
modpow :: proc(base, exp, mod: int) -> int {
if mod == 1 {
return 0}
result: int = 1
base := base
exp := exp
base %= mod
for ; exp > 0; exp >>= 1 {
if ((exp & 1) == 1) {
result = (result * base) % mod}
base = (base * base) % mod
}
return result
}
 
is_curzon :: proc(n: int, k: int) -> bool {
r := k * n //const?
return modpow(k, n, r + 1) == r
}
</syntaxhighlight>
{{out}}
<pre>
Curzon numbers with base 2
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
1000th Curzon number with base 2: 8646
 
Curzon numbers with base 4
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
1000th Curzon number with base 4: 9375
 
Curzon numbers with base 6
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
1000th Curzon number with base 6: 20717
 
Curzon numbers with base 8
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
1000th Curzon number with base 8: 22176
 
Curzon numbers with base 10
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
1000th Curzon number with base 10: 46845
</pre>
 
Line 459 ⟶ 1,397:
 
It isn't clear why the task description says "generalized Curzon numbers only exist for even base integers." If k >= 3 is an odd base, then, besides the trivial solution n = 1, it can be checked that n = k^(k-1) is a Curzon number according to the given definition. It seems from the output below that Curzon numbers with an odd base are much scarcer than those with an even base.
<langsyntaxhighlight lang="pascal">
program CurzonNumbers;
uses SysUtils;
Line 528 ⟶ 1,466:
ListCurzonNumbers(11);
end.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 589 ⟶ 1,527:
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">ClearAll[CurzonNumberQ]
CurzonNumberQ[b_Integer][n_Integer]:=PowerMod[b,n,b n+1]==b n
val=Select[Range[100000],CurzonNumberQ[2]];
Line 609 ⟶ 1,547:
val=Select[Range[100000],CurzonNumberQ[10]];
Take[val,50]
val[[1000]]</langsyntaxhighlight>
{{out}}
<pre>{1, 2, 5, 6, 9, 14, 18, 21, 26, 29, 30, 33, 41, 50, 53, 54, 65, 69, 74, 78, 81, 86, 89, 90, 98, 105, 113, 114, 125, 134, 138, 141, 146, 153, 158, 165, 173, 174, 186, 189, 194, 198, 209, 210, 221, 230, 233, 245, 249, 254}
Line 630 ⟶ 1,568:
 
46845</pre>
 
=={{header|PARI/GP}}==
{{trans|Mathematica/Wolfram_Language}}
<syntaxhighlight lang="PARI/GP">
/* Define the CurzonNumberQ function for base b */
powermod(a,k,n)=lift(Mod(a,n)^k)
CurzonNumberQ(b, n) = (powermod(b,n,b*n+1)== b*n);
 
/* Define a function to find Curzon numbers within a range for base b */
FindCurzonNumbers(b, maxrange) = {
local(val, res, i);
val = vector(maxrange);
res = [];
for(i = 1, maxrange,
if(CurzonNumberQ(b, i), res = concat(res, i));
);
return(Vec(res));
}
 
/* Select and display the first 50 Curzon numbers and the 1000th for base 2 */
val = FindCurzonNumbers(2, 100000);
print(vector(50, i, val[i])); /* First 50 */
print(val[1000]); /* 1000th Curzon number */
 
/* Select and display for base 4 */
val = FindCurzonNumbers(4, 100000);
print(vector(50, i, val[i])); /* First 50 */
print(val[1000]); /* 1000th Curzon number */
 
/* Select and display for base 6 */
val = FindCurzonNumbers(6, 100000);
print(vector(50, i, val[i])); /* First 50 */
print(val[1000]); /* 1000th Curzon number */
 
/* Select and display for base 8 */
val = FindCurzonNumbers(8, 100000);
print(vector(50, i, val[i])); /* First 50 */
print(val[1000]); /* 1000th Curzon number */
 
/* Select and display for base 10 */
val = FindCurzonNumbers(10, 100000);
print(vector(50, i, val[i])); /* First 50 */
print(val[1000]); /* 1000th Curzon number */
</syntaxhighlight>
{{out}}
<pre>
[1, 2, 5, 6, 9, 14, 18, 21, 26, 29, 30, 33, 41, 50, 53, 54, 65, 69, 74, 78, 81, 86, 89, 90, 98, 105, 113, 114, 125, 134, 138, 141, 146, 153, 158, 165, 173, 174, 186, 189, 194, 198, 209, 210, 221, 230, 233, 245, 249, 254]
8646
[1, 3, 7, 9, 13, 15, 25, 27, 37, 39, 43, 45, 49, 57, 67, 69, 73, 79, 87, 93, 97, 99, 105, 115, 127, 135, 139, 153, 163, 165, 169, 175, 177, 183, 189, 193, 199, 205, 207, 213, 219, 235, 249, 253, 255, 265, 267, 273, 277, 279]
9375
[1, 6, 30, 58, 70, 73, 90, 101, 105, 121, 125, 146, 153, 166, 170, 181, 182, 185, 210, 233, 241, 242, 266, 282, 290, 322, 373, 381, 385, 390, 397, 441, 445, 446, 450, 453, 530, 557, 562, 585, 593, 601, 602, 605, 606, 621, 646, 653, 670, 685]
20717
[1, 14, 35, 44, 72, 74, 77, 129, 131, 137, 144, 149, 150, 185, 200, 219, 236, 266, 284, 285, 299, 309, 336, 357, 381, 386, 390, 392, 402, 414, 420, 441, 455, 459, 470, 479, 500, 519, 527, 536, 557, 582, 600, 602, 617, 639, 654, 674, 696, 735]
22176
[1, 9, 10, 25, 106, 145, 190, 193, 238, 253, 306, 318, 349, 385, 402, 462, 486, 526, 610, 649, 658, 678, 733, 762, 810, 990, 994, 1033, 1077, 1125, 1126, 1141, 1149, 1230, 1405, 1422, 1441, 1485, 1509, 1510, 1513, 1606, 1614, 1630, 1665, 1681, 1690, 1702, 1785, 1837]
46845
</pre>
 
=={{header|Perl}}==
{{libheader|ntheory}}
<lang perl>use strict;
<syntaxhighlight lang="perl">use strict;
use warnings;
use Math::AnyNumntheory 'ipowpowmod';
 
sub curzon {
Line 640 ⟶ 1,636:
my($n,@C) = 0;
while (++$n) {
push @C,my $n if 0r == (ipow($base,$n) + 1) % ($base * $n + 1);
push @C, $n if powmod($base, $n, $r + 1) == $r;
return @C if $cnt == @C;
}
Line 647 ⟶ 1,644:
my $upto = 50;
for my $k (<2 4 6 8 10>) {
my @C = curzon( $k, 1000);
print "First $upto Curzon numbers using a base of $k:\n" .
(sprintf "@{['%5d' x $upto]}", @C[0..$upto-1]) =~ s/(.{125100})/$1&\n/gr;
printprintf "%50s\n\n", "Thousandth: $C[-1]\n\n";
}</langsyntaxhighlight>
{{out}}
<pre>
<pre>First 50 Curzon numbers using a base of 2:
First 50 Curzon numbers using a base of 2:
1 2 5 6 9 14 18 21 26 29 30 33 41 50 53 54 65 69 74 78 81 86 89 90 98
105 113 1141 125 1342 138 1415 146 1536 158 1659 173 14 174 18618 189 21 194 19826 209 29 210 22130 230 33 233 24541 249 50 254 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134 138 141 146 153 158 165 173 174 186 189
Thousandth: 8646
194 198 209 210 221 230 233 245 249 254 Thousandth: 8646
 
First 50 Curzon numbers using a base of 4:
1 3 7 9 13 15 25 27 37 39 43 45 49 57 67 69 73 79 87 93 97 99 105 115 127
97 99 105 115 127 135 139 153 163 165 169 175 177 183 189 193 199 205 207 213 219 235 249 253 255 265 267 273 277 279
219 235 249 253 255 265 267 273 277 279 Thousandth: 9375
Thousandth: 9375
 
First 50 Curzon numbers using a base of 6:
1 6 30 58 70 73 90 101 105 121 125 146 153 166 170 181 182 185 210 233 241 242 266 282 290
241 242 266 282 290 322 373 381 385 390 397 441 445 446 450 453 530 557 562 585 593 601 602 605 606 621 646 653 670 685
593 601 602 605 606 621 646 653 670 685 Thousandth: 20717
Thousandth: 20717
 
First 50 Curzon numbers using a base of 8:
1 14 35 44 72 74 77 129 131 137 144 149 150 185 200 219 236 266 284 285 299 309 336 357 381
299 309 336 357 381 386 390 392 402 414 420 441 455 459 470 479 500 519 527 536 557 582 600 602 617 639 654 674 696 735
557 582 600 602 617 639 654 674 696 735 Thousandth: 22176
Thousandth: 22176
 
First 50 Curzon numbers using a base of 10:
1 9 10 25 106 145 190 193 238 253 306 318 349 385 402 462 486 526 610 649 658 678 733 762 810
658 678 733 762 810 990 994 1033 1077 1125 1126 1141 1149 1230 1405 1422 1441 1485 1509 1510 1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837 Thousandth: 46845
Thousandth: 46845</pre>
</pre>
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
Line 703 ⟶ 1,702:
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 730 ⟶ 1,729:
990 994 1033 1077 1125 1126 1141 1149 1230 1405 1422 1441 1485 1509 1510 1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
One thousandth: 46845
</pre>
 
=={{header|Python}}==
<syntaxhighlight lang="python">def is_Curzon(n, k):
r = k * n
return pow(k, n, r + 1) == r
 
for k in [2, 4, 6, 8, 10]:
n, curzons = 1, []
while len(curzons) < 1000:
if is_Curzon(n, k):
curzons.append(n)
n += 1
print(f'Curzon numbers with k = {k}:')
for i, c in enumerate(curzons[:50]):
print(f'{c: 5,}', end='\n' if (i + 1) % 25 == 0 else '')
print(f' Thousandth Curzon with k = {k}: {curzons[999]}.\n')</syntaxhighlight>
{{out}}
<pre>
Curzon numbers with k = 2:
1 2 5 6 9 14 18 21 26 29 30 33 41 50 53 54 65 69 74 78 81 86 89 90 98
105 113 114 125 134 138 141 146 153 158 165 173 174 186 189 194 198 209 210 221 230 233 245 249 254
Thousandth Curzon with k = 2: 8646.
 
Curzon numbers with k = 4:
1 3 7 9 13 15 25 27 37 39 43 45 49 57 67 69 73 79 87 93 97 99 105 115 127
135 139 153 163 165 169 175 177 183 189 193 199 205 207 213 219 235 249 253 255 265 267 273 277 279
Thousandth Curzon with k = 4: 9375.
 
Curzon numbers with k = 6:
1 6 30 58 70 73 90 101 105 121 125 146 153 166 170 181 182 185 210 233 241 242 266 282 290
322 373 381 385 390 397 441 445 446 450 453 530 557 562 585 593 601 602 605 606 621 646 653 670 685
Thousandth Curzon with k = 6: 20717.
 
Curzon numbers with k = 8:
1 14 35 44 72 74 77 129 131 137 144 149 150 185 200 219 236 266 284 285 299 309 336 357 381
386 390 392 402 414 420 441 455 459 470 479 500 519 527 536 557 582 600 602 617 639 654 674 696 735
Thousandth Curzon with k = 8: 22176.
 
Curzon numbers with k = 10:
1 9 10 25 106 145 190 193 238 253 306 318 349 385 402 462 486 526 610 649 658 678 733 762 810
990 994 1,033 1,077 1,125 1,126 1,141 1,149 1,230 1,405 1,422 1,441 1,485 1,509 1,510 1,513 1,606 1,614 1,630 1,665 1,681 1,690 1,702 1,785 1,837
Thousandth Curzon with k = 10: 46845.
</pre>
 
=={{header|Quackery}}==
 
<langsyntaxhighlight Quackerylang="quackery"> [ number$
space 4 of swap join
-5 split nip echo$ ] is rjust ( n --> )
Line 766 ⟶ 1,808:
say " ... "
-1 peek echo cr cr ]
</syntaxhighlight>
</lang>
 
{{out}}
Line 812 ⟶ 1,854:
 
=={{header|Raku}}==
<syntaxhighlight lang="raku" perl6line>sub curzon ($base) { lazy (1..∞).hyper.map: { $_ if (exp($_, $base) + 1) %% ($base × $_ + 1) } };
 
for <2 4 6 8 10> {
my $curzon = .&curzon;
say "\nFirst 50 Curzon numbers using a base of $_:\n" ~
$curzon[^50].batch(2510)».fmt("%4s").join("\n") ~
"\nOne thousandth: " ~ $curzon[999]
}</langsyntaxhighlight>
{{out}}
<pre>First 50 Curzon numbers using a base of 2:
1 2 5 6 9 14 18 21 26 29 30 33 41 50 53 54 65 69 74 78 81 86 89 90 98
105 11330 114 33 125 13441 138 50 141 14653 153 54 158 16565 173 69 174 18674 189 194 198 209 210 221 230 233 245 249 25478
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
One thousandth: 8646
 
First 50 Curzon numbers using a base of 4:
1 3 7 9 13 15 25 27 37 39 43 45 49 57 67 69 73 79 87 93 97 99 105 115 127
135 13943 153 45 163 16549 169 57 175 17767 183 69 189 19373 199 79 205 20787 213 219 235 249 253 255 265 267 273 277 27993
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
One thousandth: 9375
 
First 50 Curzon numbers using a base of 6:
1 6 30 58 70 73 90 101 105 121 125 146 153 166 170 181 182 185 210 233 241 242 266 282 290
125 146 153 166 170 181 182 185 210 233
322 373 381 385 390 397 441 445 446 450 453 530 557 562 585 593 601 602 605 606 621 646 653 670 685
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
One thousandth: 20717
 
First 50 Curzon numbers using a base of 8:
1 14 35 44 72 74 77 129 131 137 144 149 150 185 200 219 236 266 284 285 299 309 336 357 381
144 149 150 185 200 219 236 266 284 285
386 390 392 402 414 420 441 455 459 470 479 500 519 527 536 557 582 600 602 617 639 654 674 696 735
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
One thousandth: 22176
 
First 50 Curzon numbers using a base of 10:
1 9 10 25 106 145 190 193 238 253 306 318 349 385 402 462 486 526 610 649 658 678 733 762 810
306 318 349 385 402 462 486 526 610 649
990 994 1033 1077 1125 1126 1141 1149 1230 1405 1422 1441 1485 1509 1510 1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
One thousandth: 46845</pre>
 
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
{| class="wikitable"
! Code
! Comments
|-
|
≪ → x n m
≪ '''IF''' OVER
'''THEN''' 1 1 n '''START''' x * m MOD '''NEXT'''
'''ELSE''' 1 '''END'''
≫ ≫ 'XnMOD' STO
≪ → k
≪ {} 1 '''WHILE''' OVER SIZE 50 < '''REPEAT'''
k OVER * 1 +
DUP2 k ROT ROT XnMOD 1 + SWAP MOD
'''IF''' NOT '''THEN''' SWAP OVER + SWAP '''END'''
1 +
'''END''' DROP
≫ ≫ 'QRZ50' STO
|
''( x n m -- (x^n mod m) )''
If n<>0...
then x^n mod m = (((x mod m) * x mod m) ... * x mod m)
else x^0 mod m = 1
''( k -- { 50 Curzon numbers } )''
Initialize
Get k*n + 1
Get k^n+1 mod k*n+1
If zero then add it to sequence
Increment n
|}
The following line of code delivers what is required:
2 QRZ50 10 QRZ50
{{out}}
<pre>
2: { 1 2 5 6 9 14 18 21 26 29 30 33 41 50 53 54 65 69 74 78 81 86 89 90 98 105 113 114 125 134 138 141 146 153 158 165 173 174 186 189 194 198 209 210 221 230 233 245 249 254 }
1: { 1 9 10 25 106 145 190 193 238 253 306 318 349 385 402 462 486 526 610 649 658 678 733 762 810 990 994 1033 1077 1125 1126 1141 1149 1230 1405 1422 1441 1485 1509 1510 1513 1606 1614 1630 1665 1681 1690 1702 1785 1837 }
</pre>
 
=={{header|Ruby}}==
<syntaxhighlight lang="ruby">def curzons(k)
Enumerator.new do |y|
(1..).each do |n|
r = k * n
y << n if k.pow(n, r + 1) == r
end
end
end
 
[2,4,6,8,10].each do |base|
puts "Curzon numbers with k = #{base}:"
puts curzons(base).take(50).join(", ")
puts "Thousandth Curzon with k = #{base}: #{curzons(base).find.each.with_index(1){|_,i| i == 1000} }",""
end</syntaxhighlight>
 
{{out}}<pre>Curzon numbers with k = 2:
1, 2, 5, 6, 9, 14, 18, 21, 26, 29, 30, 33, 41, 50, 53, 54, 65, 69, 74, 78, 81, 86, 89, 90, 98, 105, 113, 114, 125, 134, 138, 141, 146, 153, 158, 165, 173, 174, 186, 189, 194, 198, 209, 210, 221, 230, 233, 245, 249, 254
Thousandth Curzon with k = 2: 8646.
 
Curzon numbers with k = 4:
1, 3, 7, 9, 13, 15, 25, 27, 37, 39, 43, 45, 49, 57, 67, 69, 73, 79, 87, 93, 97, 99, 105, 115, 127, 135, 139, 153, 163, 165, 169, 175, 177, 183, 189, 193, 199, 205, 207, 213, 219, 235, 249, 253, 255, 265, 267, 273, 277, 279
Thousandth Curzon with k = 4: 9375.
 
Curzon numbers with k = 6:
1, 6, 30, 58, 70, 73, 90, 101, 105, 121, 125, 146, 153, 166, 170, 181, 182, 185, 210, 233, 241, 242, 266, 282, 290, 322, 373, 381, 385, 390, 397, 441, 445, 446, 450, 453, 530, 557, 562, 585, 593, 601, 602, 605, 606, 621, 646, 653, 670, 685
Thousandth Curzon with k = 6: 20717.
 
Curzon numbers with k = 8:
1, 14, 35, 44, 72, 74, 77, 129, 131, 137, 144, 149, 150, 185, 200, 219, 236, 266, 284, 285, 299, 309, 336, 357, 381, 386, 390, 392, 402, 414, 420, 441, 455, 459, 470, 479, 500, 519, 527, 536, 557, 582, 600, 602, 617, 639, 654, 674, 696, 735
Thousandth Curzon with k = 8: 22176.
 
Curzon numbers with k = 10:
1, 9, 10, 25, 106, 145, 190, 193, 238, 253, 306, 318, 349, 385, 402, 462, 486, 526, 610, 649, 658, 678, 733, 762, 810, 990, 994, 1033, 1077, 1125, 1126, 1141, 1149, 1230, 1405, 1422, 1441, 1485, 1509, 1510, 1513, 1606, 1614, 1630, 1665, 1681, 1690, 1702, 1785, 1837
Thousandth Curzon with k = 10: 46845.
</pre>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">fn modpow(mut base: usize, mut exp: usize, n: usize) -> usize {
<lang rust>// [dependencies]
// rug if n == "1.15.0" {
return 0;
}
let mut result = 1;
base %= n;
while exp > 0 {
if (exp & 1) == 1 {
result = (result * base) % n;
}
base = (base * base) % n;
exp >>= 1;
}
result
}
 
fn is_curzon(n: usize, k: usize) -> bool {
let m = k * n + 1;
modpow(k, n, m) + 1 == m
 
fn is_curzon(n: u32, k: u32) -> bool {
use rug::{Complete, Integer};
(Integer::u_pow_u(k, n).complete() + 1) % (k * n + 1) == 0
}
 
Line 878 ⟶ 2,031:
println!("1000th Curzon number with base {k}: {n}\n");
}
}</langsyntaxhighlight>
 
{{out}}
Line 925 ⟶ 2,078:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func is_curzon(n, k) {
powmod(k, n, k*n + 1).is_congruent(-1, k*n + 1) && (n > 0)
}
Line 933 ⟶ 2,086:
say 50.by {|n| is_curzon(n, k) }.join(' ')
say ("1000th term: ", 1000.th {|n| is_curzon(n,k) })
}</langsyntaxhighlight>
 
{{out}}
Line 956 ⟶ 2,109:
1 9 10 25 106 145 190 193 238 253 306 318 349 385 402 462 486 526 610 649 658 678 733 762 810 990 994 1033 1077 1125 1126 1141 1149 1230 1405 1422 1441 1485 1509 1510 1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
1000th term: 46845
</pre>
 
=={{header|V (Vlang)}}==
{{trans|go}}
<syntaxhighlight lang="v (vlang)">import math.big
 
fn main() {
zero := big.zero_int
one := big.one_int
for k := i64(2); k <= 10; k += 2 {
bk := big.integer_from_i64(k)
println("The first 50 Curzon numbers using a base of $k:")
mut count := 0
mut n := i64(1)
mut pow := big.integer_from_i64(k)
mut curzon50 := []i64{}
for {
z := pow + one
d := k*n + 1
bd := big.integer_from_i64(d)
if z%bd == zero {
if count < 50 {
curzon50 << n
}
count++
if count == 50 {
for i in 0..curzon50.len {
print("${curzon50[i]:4} ")
if (i+1)%10 == 0 {
println('')
}
}
print("\nOne thousandth: ")
}
if count == 1000 {
println(n)
break
}
}
n++
pow *= bk
}
println('')
}
}</syntaxhighlight>
 
{{out}}
<pre>
The first 50 Curzon numbers using a base of 2 :
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
 
One thousandth: 8646
 
The first 50 Curzon numbers using a base of 4 :
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
 
One thousandth: 9375
 
The first 50 Curzon numbers using a base of 6 :
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
 
One thousandth: 20717
 
The first 50 Curzon numbers using a base of 8 :
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
 
One thousandth: 22176
 
The first 50 Curzon numbers using a base of 10 :
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
 
One thousandth: 46845
</pre>
 
=={{header|Wren}}==
===Version 1 (Embedded using GMP)===
{{libheader|Wren-gmp}}
{{libheader|Wren-seq}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">/* curzon_numbersCurzon_numbers.wren */
 
import "./gmp" for Mpz
import "./seq" for Lst
import "./fmt" for Fmt
 
Line 981 ⟶ 2,225:
count = count + 1
if (count == 50) {
for (chunk in Lst.chunks(curzon50, 10)) Fmt.printtprint("$4d", chunkcurzon50, 10)
System.write("\nOne thousandth: ")
}
if (count == 1000) {
SystemFmt.print("$,d", n)
break
}
Line 993 ⟶ 2,237:
}
System.print()
}</langsyntaxhighlight>
 
{{out}}
<pre>
The first 50 Curzon numbers using a base of 2:
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
 
One thousandth: 86468,646
 
The first 50 Curzon numbers using a base of 4:
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
 
One thousandth: 93759,375
 
The first 50 Curzon numbers using a base of 6:
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
 
One thousandth: 2071720,717
 
The first 50 Curzon numbers using a base of 8:
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
 
One thousandth: 2217622,176
 
The first 50 Curzon numbers using a base of 10:
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
 
One thousandth: 4684546,845
</pre>
===Version 2 (Wren-cli)===
{{trans|C++}}
{{libheader|Wren-math}}
Alternatively, using ''Int.modPow'' rather than ''GMP'' so it will run on Wren-cli, albeit about 6 times more slowly.
<syntaxhighlight lang="wren">import "./math" for Int
import "./fmt" for Fmt
 
var isCurzon = Fn.new { |n, k|
var r = k * n
return Int.modPow(k, n, r+1) == r
}
 
var k = 2
while (k <= 10) {
System.print("Curzon numbers with base %(k):")
var n = 1
var count = 0
while (count < 50) {
if (isCurzon.call(n, k)) {
Fmt.write("$4d ", n)
count = count + 1
if (count % 10 == 0) System.print()
}
n = n + 1
}
while (true) {
if (isCurzon.call(n, k)) count = count + 1
if (count == 1000) break
n = n + 1
}
Fmt.print("1,000th Curzon number with base $d: $,d\n", k, n)
k = k + 2
}</syntaxhighlight>
 
{{out}}
<pre>
As Version 1.
</pre>
 
=={{header|XPL0}}==
{{trans|C}}
<syntaxhighlight lang "XPL0">func ModPow(Base, Exp, Mod);
int Base, Exp, Mod, Result;
[if Mod = 1 then return 0;
Result:= 1;
Base:= rem(Base/Mod);
while Exp > 0 do
[if (Exp&1) = 1 then Result:= rem((Result*Base)/Mod);
Base:= rem((Base*Base) / Mod);
Exp:= Exp >> 1;
];
return Result;
];
 
func IsCurzon(N, K);
int N, K, R;
[R:= K * N;
return ModPow(K, N, R+1) = R;
];
 
int K, N, Count;
[K:= 2;
Format(5, 0);
while K <= 10 do
[Text(0, "Curzon numbers with base "); IntOut(0, K); CrLf(0);
N:= 1; Count:= 0;
while Count < 50 do
[if IsCurzon(N, K) then
[RlOut(0, float(N));
Count:= Count+1;
if rem(Count/10) = 0 then CrLf(0);
];
N:= N+1;
];
K:= K+2;
];
]</syntaxhighlight>
{{out}}
<pre>
Curzon numbers with base 2
1 2 5 6 9 14 18 21 26 29
30 33 41 50 53 54 65 69 74 78
81 86 89 90 98 105 113 114 125 134
138 141 146 153 158 165 173 174 186 189
194 198 209 210 221 230 233 245 249 254
Curzon numbers with base 4
1 3 7 9 13 15 25 27 37 39
43 45 49 57 67 69 73 79 87 93
97 99 105 115 127 135 139 153 163 165
169 175 177 183 189 193 199 205 207 213
219 235 249 253 255 265 267 273 277 279
Curzon numbers with base 6
1 6 30 58 70 73 90 101 105 121
125 146 153 166 170 181 182 185 210 233
241 242 266 282 290 322 373 381 385 390
397 441 445 446 450 453 530 557 562 585
593 601 602 605 606 621 646 653 670 685
Curzon numbers with base 8
1 14 35 44 72 74 77 129 131 137
144 149 150 185 200 219 236 266 284 285
299 309 336 357 381 386 390 392 402 414
420 441 455 459 470 479 500 519 527 536
557 582 600 602 617 639 654 674 696 735
Curzon numbers with base 10
1 9 10 25 106 145 190 193 238 253
306 318 349 385 402 462 486 526 610 649
658 678 733 762 810 990 994 1033 1077 1125
1126 1141 1149 1230 1405 1422 1441 1485 1509 1510
1513 1606 1614 1630 1665 1681 1690 1702 1785 1837
</pre>
1,969

edits