Repunit primes
You are encouraged to solve this task according to the task description, using any language you may know.
Repunit is a portmanteau of the words "repetition" and "unit", with unit being "unit value"... or in laymans terms, 1. So 1, 11, 111, 1111 & 11111 are all repunits.
Every standard integer base has repunits since every base has the digit 1. This task involves finding the repunits in different bases that are prime.
In base two, the repunits 11, 111, 11111, 1111111, etc. are prime. (These correspond to the Mersenne primes.)
In base three: 111, 1111111, 1111111111111, etc.
Repunit primes, by definition, are also circular primes.
Any repunit in any base having a composite number of digits is necessarily composite. Only repunits (in any base) having a prime number of digits might be prime.
Rather than expanding the repunit out as a giant list of 1s or converting to base 10, it is common to just list the number of 1s in the repunit; effectively the digit count. The base two repunit primes listed above would be represented as: 2, 3, 5, 7, etc.
Many of these sequences exist on OEIS, though they aren't specifically listed as "repunit prime digits" sequences.
Some bases have very few repunit primes. Bases 4, 8, and likely 16 have only one. Base 9 has none at all. Bases above 16 may have repunit primes as well... but this task is getting large enough already.
- Task
- For bases 2 through 16, Find and show, here on this page, the repunit primes as digit counts, up to a limit of 1000.
- Stretch
- Increase the limit to 2700 (or as high as you have patience for.)
- See also
- Wikipedia: Repunit primes
- OEIS:A000043 - Mersenne exponents: primes p such that 2^p - 1 is prime. Then 2^p - 1 is called a Mersenne prime (base 2)
- OEIS:A028491 - Numbers k such that (3^k - 1)/2 is prime (base 3)
- OEIS:A004061 - Numbers n such that (5^n - 1)/4 is prime (base 5)
- OEIS:A004062 - Numbers n such that (6^n - 1)/5 is prime (base 6)
- OEIS:A004063 - Numbers k such that (7^k - 1)/6 is prime (base 7)
- OEIS:A004023 - Indices of prime repunits: numbers n such that 11...111 (with n 1's) = (10^n - 1)/9 is prime (base 10)
- OEIS:A005808 - Numbers k such that (11^k - 1)/10 is prime (base 11)
- OEIS:A004064 - Numbers n such that (12^n - 1)/11 is prime (base 12)
- OEIS:A016054 - Numbers n such that (13^n - 1)/12 is prime (base 13)
- OEIS:A006032 - Numbers k such that (14^k - 1)/13 is prime (base 14)
- OEIS:A006033 - Numbers n such that (15^n - 1)/14 is prime (base 15)
- Related task: Circular primes
ALGOL 68
BEGIN # find repunit (all digits are 1 ) primes in various bases #
INT max base = 16;
INT max repunit digits = 1000;
PR precision 3000 PR # set precision of LONG LONG INT #
# 16^1000 has ~1200 digits but the primality test needs more #
PR read "primes.incl.a68" PR # include prime utilities #
[]BOOL prime = PRIMESIEVE max repunit digits;
FOR base FROM 2 TO max base DO
LONG LONG INT repunit := 1;
print( ( whole( base, -2 ), ":" ) );
FOR digits TO max repunit digits DO
IF prime[ digits ] THEN
IF is probably prime( repunit ) THEN
# found a prime repunit in the current base #
print( ( " ", whole( digits, 0 ) ) )
FI
FI;
repunit *:= base +:= 1
OD;
print( ( newline ) )
OD
END
- Output:
2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 3: 3 7 13 71 103 541 4: 2 5: 3 7 11 13 47 127 149 181 619 929 6: 2 3 7 29 71 127 271 509 7: 5 13 131 149 8: 3 9: 10: 2 19 23 317 11: 17 19 73 139 907 12: 2 3 5 19 97 109 317 353 701 13: 5 7 137 283 883 991 14: 3 7 19 31 41 15: 3 43 73 487 16: 2
Arturo
getRepunit: function [n,b][
result: 1
loop 1..dec n 'z ->
result: result + b^z
return result
]
loop 2..16 'base [
print [
pad (to :string base) ++ ":" 4
join.with:", " to [:string] select 2..1001 'x ->
and? -> prime? x
-> prime? getRepunit x base
]
]
- Output:
2: 2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607 3: 3, 7, 13, 71, 103, 541 4: 2 5: 3, 7, 11, 13, 47, 127, 149, 181, 619, 929 6: 2, 3, 7, 29, 71, 127, 271, 509 7: 5, 13, 131, 149 8: 3 9: 10: 2, 19, 23, 317 11: 17, 19, 73, 139, 907 12: 2, 3, 5, 19, 97, 109, 317, 353, 701 13: 5, 7, 137, 283, 883, 991 14: 3, 7, 19, 31, 41 15: 3, 43, 73, 487 16: 2
C++
#include <future>
#include <iomanip>
#include <iostream>
#include <vector>
#include <gmpxx.h>
#include <primesieve.hpp>
std::vector<uint64_t> repunit_primes(uint32_t base,
const std::vector<uint64_t>& primes) {
std::vector<uint64_t> result;
for (uint64_t prime : primes) {
mpz_class repunit(std::string(prime, '1'), base);
if (mpz_probab_prime_p(repunit.get_mpz_t(), 25) != 0)
result.push_back(prime);
}
return result;
}
int main() {
std::vector<uint64_t> primes;
const uint64_t limit = 2700;
primesieve::generate_primes(limit, &primes);
std::vector<std::future<std::vector<uint64_t>>> futures;
for (uint32_t base = 2; base <= 36; ++base) {
futures.push_back(std::async(repunit_primes, base, primes));
}
std::cout << "Repunit prime digits (up to " << limit << ") in:\n";
for (uint32_t base = 2, i = 0; base <= 36; ++base, ++i) {
std::cout << "Base " << std::setw(2) << base << ':';
for (auto digits : futures[i].get())
std::cout << ' ' << digits;
std::cout << '\n';
}
}
- Output:
This takes about 4 minutes 12 seconds (3.2GHz Quad-Core Intel Core i5).
Repunit prime digits (up to 2700) in: Base 2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281 Base 3: 3 7 13 71 103 541 1091 1367 1627 Base 4: 2 Base 5: 3 7 11 13 47 127 149 181 619 929 Base 6: 2 3 7 29 71 127 271 509 1049 Base 7: 5 13 131 149 1699 Base 8: 3 Base 9: Base 10: 2 19 23 317 1031 Base 11: 17 19 73 139 907 1907 2029 Base 12: 2 3 5 19 97 109 317 353 701 Base 13: 5 7 137 283 883 991 1021 1193 Base 14: 3 7 19 31 41 2687 Base 15: 3 43 73 487 2579 Base 16: 2 Base 17: 3 5 7 11 47 71 419 Base 18: 2 Base 19: 19 31 47 59 61 107 337 1061 Base 20: 3 11 17 1487 Base 21: 3 11 17 43 271 Base 22: 2 5 79 101 359 857 Base 23: 5 Base 24: 3 5 19 53 71 653 661 Base 25: Base 26: 7 43 347 Base 27: 3 Base 28: 2 5 17 457 1423 Base 29: 5 151 Base 30: 2 5 11 163 569 1789 Base 31: 7 17 31 Base 32: Base 33: 3 197 Base 34: 13 1493 Base 35: 313 1297 Base 36: 2
F#
This task uses Extensible Prime Generator (F#)
// Repunit primes. Nigel Galloway: January 24th., 2022
let rUnitP(b:int)=let b=bigint b in primes32()|>Seq.takeWhile((>)1000)|>Seq.map(fun n->(n,((b**n)-1I)/(b-1I)))|>Seq.filter(fun(_,n)->Open.Numeric.Primes.MillerRabin.IsProbablePrime &n)|>Seq.map fst
[2..16]|>List.iter(fun n->printf $"Base %d{n}: "; rUnitP(n)|>Seq.iter(printf "%d "); printfn "")
- Output:
Base 2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 Base 3: 3 7 13 71 103 541 Base 4: 2 Base 5: 3 7 11 13 47 127 149 181 619 929 Base 6: 2 3 7 29 71 127 271 509 Base 7: 5 13 131 149 Base 8: 3 Base 9: Base 10: 2 19 23 317 Base 11: 17 19 73 139 907 Base 12: 2 3 5 19 97 109 317 353 701 Base 13: 5 7 137 283 883 991 Base 14: 3 7 19 31 41 Base 15: 3 43 73 487 Base 16: 2
FreeBASIC
' version 04-10-2024
' compile with: fbc -s console
#Include Once "gmp.bi"
#Define max 2700
Dim As UInteger j, i, m, n, tmp, ub
ReDim As UInteger sieve(max), primes(max)
Dim As Mpz_ptr rp
rp = Allocate(Len(__Mpz_struct)) : Mpz_init(rp)
For j = 4 To max Step 2
sieve(j) = 1
Next
For j = 3 To max Step 2
If sieve(j) = 0 Then
For i = j * j To max Step j + j
sieve(i) = 1
Next
End If
Next
i = 0
For j = 2 To max
If sieve(j) = 0 Then
i += 1
primes(i) = j
End If
Next
ub = i
For j = 2 To 36
Print Using "### : "; j;
For i = 1 To ub
mpz_ui_pow_ui(rp, j , primes(i))
mpz_sub_ui(rp, rp , 1)
mpz_divexact_ui(rp, rp, j -1)
If mpz_tstbit(rp ,0) = 1 Then
If mpz_probab_prime_p(rp, 40) > 0 Then
Print primes(i); " ";
End If
End If
Next
Print
Next
mpz_clear(rp)
' empty keyboard buffer
While InKey <> "" : Wend
Print : Print "hit any key to end program"
Sleep
End
- Output:
2 : 2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281 3 : 3 7 13 71 103 541 1091 1367 1627 4 : 2 5 : 3 7 11 13 47 127 149 181 619 929 6 : 2 3 7 29 71 127 271 509 1049 7 : 5 13 131 149 1699 8 : 3 9 : 10 : 2 19 23 317 1031 11 : 17 19 73 139 907 1907 2029 12 : 2 3 5 19 97 109 317 353 701 13 : 5 7 137 283 883 991 1021 1193 14 : 3 7 19 31 41 2687 15 : 3 43 73 487 2579 16 : 2 17 : 3 5 7 11 47 71 419 18 : 2 19 : 19 31 47 59 61 107 337 1061 20 : 3 11 17 1487 21 : 3 11 17 43 271 22 : 2 5 79 101 359 857 23 : 5 24 : 3 5 19 53 71 653 661 25 : 26 : 7 43 347 27 : 3 28 : 2 5 17 457 1423 29 : 5 151 30 : 2 5 11 163 569 1789 31 : 7 17 31 32 : 33 : 3 197 34 : 13 1493 35 : 313 1297 36 : 2
Go
Took 11 minutes 25 seconds which is much the same as Wren's GMP wrapper.
package main
import (
"fmt"
big "github.com/ncw/gmp"
"rcu"
"strings"
)
func main() {
limit := 2700
primes := rcu.Primes(limit)
s := new(big.Int)
for b := 2; b <= 36; b++ {
var rPrimes []int
for _, p := range primes {
s.SetString(strings.Repeat("1", p), b)
if s.ProbablyPrime(15) {
rPrimes = append(rPrimes, p)
}
}
fmt.Printf("Base %2d: %v\n", b, rPrimes)
}
}
- Output:
Base 2: [2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281] Base 3: [3 7 13 71 103 541 1091 1367 1627] Base 4: [2] Base 5: [3 7 11 13 47 127 149 181 619 929] Base 6: [2 3 7 29 71 127 271 509 1049] Base 7: [5 13 131 149 1699] Base 8: [3] Base 9: [] Base 10: [2 19 23 317 1031] Base 11: [17 19 73 139 907 1907 2029] Base 12: [2 3 5 19 97 109 317 353 701] Base 13: [5 7 137 283 883 991 1021 1193] Base 14: [3 7 19 31 41 2687] Base 15: [3 43 73 487 2579] Base 16: [2] Base 17: [3 5 7 11 47 71 419] Base 18: [2] Base 19: [19 31 47 59 61 107 337 1061] Base 20: [3 11 17 1487] Base 21: [3 11 17 43 271] Base 22: [2 5 79 101 359 857] Base 23: [5] Base 24: [3 5 19 53 71 653 661] Base 25: [] Base 26: [7 43 347] Base 27: [3] Base 28: [2 5 17 457 1423] Base 29: [5 151] Base 30: [2 5 11 163 569 1789] Base 31: [7 17 31] Base 32: [] Base 33: [3 197] Base 34: [13 1493] Base 35: [313 1297] Base 36: [2]
J
Slow (runs a few minutes):
repunitp=. 1 p: ^&x: %&<: [
(2 + i. 15) ([ ;"0 repunitp"0/ <@# ]) i.&.(p:inv) 1000
- Output:
┌──┬─────────────────────────────────────────┐ │2 │2 3 5 7 13 17 19 31 61 89 107 127 521 607│ ├──┼─────────────────────────────────────────┤ │3 │3 7 13 71 103 541 │ ├──┼─────────────────────────────────────────┤ │4 │2 │ ├──┼─────────────────────────────────────────┤ │5 │3 7 11 13 47 127 149 181 619 929 │ ├──┼─────────────────────────────────────────┤ │6 │2 3 7 29 71 127 271 509 │ ├──┼─────────────────────────────────────────┤ │7 │5 13 131 149 │ ├──┼─────────────────────────────────────────┤ │8 │3 │ ├──┼─────────────────────────────────────────┤ │9 │ │ ├──┼─────────────────────────────────────────┤ │10│2 19 23 317 │ ├──┼─────────────────────────────────────────┤ │11│17 19 73 139 907 │ ├──┼─────────────────────────────────────────┤ │12│2 3 5 19 97 109 317 353 701 │ ├──┼─────────────────────────────────────────┤ │13│5 7 137 283 883 991 │ ├──┼─────────────────────────────────────────┤ │14│3 7 19 31 41 │ ├──┼─────────────────────────────────────────┤ │15│3 43 73 487 │ ├──┼─────────────────────────────────────────┤ │16│2 │ └──┴─────────────────────────────────────────┘
Java
import java.math.BigInteger;
public final class RepunitPrimes {
public static void main(String[] aArgs) {
final int limit = 2_700;
System.out.println("Repunit primes, up to " + limit + " digits, in:");
for ( int base = 2; base <= 16; base++ ) {
System.out.print(String.format("%s%2s%s", "Base ", base, ": "));
String repunit = "";
while ( repunit.length() < limit ) {
repunit += "1";
if ( BigInteger.valueOf(repunit.length()).isProbablePrime(CERTAINTY_LEVEL) ) {
BigInteger value = new BigInteger(repunit, base);
if ( value.isProbablePrime(CERTAINTY_LEVEL) ) {
System.out.print(repunit.length() + " ");
}
}
}
System.out.println();
}
}
private static final int CERTAINTY_LEVEL = 20;
}
- Output:
Repunit primes, up to 2700 digits, in: Base 2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281 Base 3: 3 7 13 71 103 541 1091 1367 1627 Base 4: 2 Base 5: 3 7 11 13 47 127 149 181 619 929 Base 6: 2 3 7 29 71 127 271 509 1049 Base 7: 5 13 131 149 1699 Base 8: 3 Base 9: Base 10: 2 19 23 317 1031 Base 11: 17 19 73 139 907 1907 2029 Base 12: 2 3 5 19 97 109 317 353 701 Base 13: 5 7 137 283 883 991 1021 1193 Base 14: 3 7 19 31 41 2687 Base 15: 3 43 73 487 2579 Base 16: 2
Julia
using Primes
repunitprimeinbase(n, base) = isprime(evalpoly(BigInt(base), [1 for _ in 1:n]))
for b in 2:40
println(rpad("Base $b:", 9), filter(n -> repunitprimeinbase(n, b), 1:2700))
end
- Output:
Base 2: [2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281] Base 3: [3, 7, 13, 71, 103, 541, 1091, 1367, 1627] Base 4: [2] Base 5: [3, 7, 11, 13, 47, 127, 149, 181, 619, 929] Base 6: [2, 3, 7, 29, 71, 127, 271, 509, 1049] Base 7: [5, 13, 131, 149, 1699] Base 8: [3] Base 9: Int64[] Base 10: [2, 19, 23, 317, 1031] Base 11: [17, 19, 73, 139, 907, 1907, 2029] Base 12: [2, 3, 5, 19, 97, 109, 317, 353, 701] Base 13: [5, 7, 137, 283, 883, 991, 1021, 1193] Base 14: [3, 7, 19, 31, 41, 2687] Base 15: [3, 43, 73, 487, 2579] Base 16: [2] Base 17: [3, 5, 7, 11, 47, 71, 419] Base 18: [2] Base 19: [19, 31, 47, 59, 61, 107, 337, 1061] Base 20: [3, 11, 17, 1487] Base 21: [3, 11, 17, 43, 271] Base 22: [2, 5, 79, 101, 359, 857] Base 23: [5] Base 24: [3, 5, 19, 53, 71, 653, 661] Base 25: Int64[] Base 26: [7, 43, 347] Base 27: [3] Base 28: [2, 5, 17, 457, 1423] Base 29: [5, 151] Base 30: [2, 5, 11, 163, 569, 1789] Base 31: [7, 17, 31] Base 32: Int64[] Base 33: [3, 197] Base 34: [13, 1493] Base 35: [313, 1297] Base 36: [2] Base 37: [13, 71, 181, 251, 463, 521] Base 38: [3, 7, 401, 449] Base 39: [349, 631] Base 40: [2, 5, 7, 19, 23, 29, 541, 751, 1277]
Mathematica /Wolfram Language
ClearAll[RepUnitPrimeQ]
RepUnitPrimeQ[b_][n_] := PrimeQ[FromDigits[ConstantArray[1, n], b]]
ClearAll[RepUnitPrimeQ]
RepUnitPrimeQ[b_][n_] := PrimeQ[FromDigits[ConstantArray[1, n], b]]
Do[
Print["Base ", b, ": ", Select[Range[2700], RepUnitPrimeQ[b]]]
,
{b, 2, 16}
]
Searching bases 2–16 for repunits of size 2700:
- Output:
Base 2: {2,3,5,7,13,17,19,31,61,89,107,127,521,607,1279,2203,2281} Base 3: {3,7,13,71,103,541,1091,1367,1627} Base 4: {2} Base 5: {3,7,11,13,47,127,149,181,619,929} Base 6: {2,3,7,29,71,127,271,509,1049} Base 7: {5,13,131,149,1699} Base 8: {3} Base 9: {} Base 10: {2,19,23,317,1031} Base 11: {17,19,73,139,907,1907,2029} Base 12: {2,3,5,19,97,109,317,353,701} Base 13: {5,7,137,283,883,991,1021,1193} Base 14: {3,7,19,31,41,2687} Base 15: {3,43,73,487,2579} Base 16: {2}
Nim
import std/strformat
import integers
for base in 2..16:
stdout.write &"{base:>2}:"
var rep = ""
while true:
rep.add '1'
if rep.len > 2700: break
if not rep.len.isPrime: continue
let val = newInteger(rep, base)
if val.isPrime():
stdout.write ' ', rep.len
echo()
- Output:
2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281 3: 3 7 13 71 103 541 1091 1367 1627 4: 2 5: 3 7 11 13 47 127 149 181 619 929 6: 2 3 7 29 71 127 271 509 1049 7: 5 13 131 149 1699 8: 3 9: 10: 2 19 23 317 1031 11: 17 19 73 139 907 1907 2029 12: 2 3 5 19 97 109 317 353 701 13: 5 7 137 283 883 991 1021 1193 14: 3 7 19 31 41 2687 15: 3 43 73 487 2579 16: 2
PARI/GP
default(parisizemax, "128M")
default(parisize, "64M");
repunitprimeinbase(n, base) = {
repunit = sum(i=0, n-1, base^i); /* Construct the repunit */
return(isprime(repunit)); /* Check if it's prime */
}
{
for(b=2, 40,
print("Base ", b, ": ");
for(n=1, 2700,
if(repunitprimeinbase(n, b), print1(n, " "))
);
print(""); /* Print a newline */
)
}
Perl
use strict;
use warnings;
use ntheory <is_prime fromdigits>;
my $limit = 1000;
print "Repunit prime digits (up to $limit) in:\n";
for my $base (2..16) {
printf "Base %2d: %s\n", $base, join ' ', grep { is_prime $_ and is_prime fromdigits(('1'x$_), $base) and " $_" } 1..$limit
}
- Output:
Repunit prime digits (up to 1000) in: Base 2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 Base 3: 3 7 13 71 103 541 Base 4: 2 Base 5: 3 7 11 13 47 127 149 181 619 929 Base 6: 2 3 7 29 71 127 271 509 Base 7: 5 13 131 149 Base 8: 3 Base 9: Base 10: 2 19 23 317 Base 11: 17 19 73 139 907 Base 12: 2 3 5 19 97 109 317 353 701 Base 13: 5 7 137 283 883 991 Base 14: 3 7 19 31 41 Base 15: 3 43 73 487 Base 16: 2
Phix
with javascript_semantics include mpfr.e procedure repunit(mpz z, integer n, base=10) mpz_set_si(z,0) for i=1 to n do mpz_mul_si(z,z,base) mpz_add_si(z,z,1) end for end procedure atom t0 = time() constant {limit,blimit} = iff(platform()=JS?{400,16} -- 8.8s :{1000,16}) -- 50.3s -- :{1000,36}) -- 4 min 20s -- :{2700,16}) -- 28 min 35s -- :{2700,36}) -- >patience sequence primes = get_primes_le(limit) mpz z = mpz_init() for base=2 to blimit do sequence rprimes = {} for i=1 to length(primes) do integer p = primes[i] repunit(z,p,base) if mpz_prime(z) then rprimes = append(rprimes,sprint(p)) end if end for printf(1,"Base %2d: %s\n", {base, join(rprimes)}) end for ?elapsed(time()-t0)
- Output:
Note the first half (base<=16) is from a {2700,16} run and the rest (base>16) from a {1000,36} run.
Base 2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281 Base 3: 3 7 13 71 103 541 1091 1367 1627 Base 4: 2 Base 5: 3 7 11 13 47 127 149 181 619 929 Base 6: 2 3 7 29 71 127 271 509 1049 Base 7: 5 13 131 149 1699 Base 8: 3 Base 9: Base 10: 2 19 23 317 1031 Base 11: 17 19 73 139 907 1907 2029 Base 12: 2 3 5 19 97 109 317 353 701 Base 13: 5 7 137 283 883 991 1021 1193 Base 14: 3 7 19 31 41 2687 Base 15: 3 43 73 487 2579 Base 16: 2 Base 17: 3 5 7 11 47 71 419 Base 18: 2 Base 19: 19 31 47 59 61 107 337 Base 20: 3 11 17 Base 21: 3 11 17 43 271 Base 22: 2 5 79 101 359 857 Base 23: 5 Base 24: 3 5 19 53 71 653 661 Base 25: Base 26: 7 43 347 Base 27: 3 Base 28: 2 5 17 457 Base 29: 5 151 Base 30: 2 5 11 163 569 Base 31: 7 17 31 Base 32: Base 33: 3 197 Base 34: 13 Base 35: 313 Base 36: 2
Python
from sympy import isprime
for b in range(2, 17):
print(b, [n for n in range(2, 1001) if isprime(n) and isprime(int('1'*n, base=b))])
- Output:
2 [2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607] 3 [3, 7, 13, 71, 103, 541] 4 [2] 5 [3, 7, 11, 13, 47, 127, 149, 181, 619, 929] 6 [2, 3, 7, 29, 71, 127, 271, 509] 7 [5, 13, 131, 149] 8 [3] 9 [] 10 [2, 19, 23, 317] 11 [17, 19, 73, 139, 907] 12 [2, 3, 5, 19, 97, 109, 317, 353, 701] 13 [5, 7, 137, 283, 883, 991] 14 [3, 7, 19, 31, 41] 15 [3, 43, 73, 487] 16 [2]
Quackery
prime
is defined at Miller–Rabin primality test#Quackery.
[ base put
1 temp put
[] 1 1000 times
[ temp share prime if
[ dup prime if
[ dip [ i^ 1+ join ] ] ]
base share * 1+
1 temp tally ]
drop
temp release
base release ] is repunitprimes ( n --> [ )
15 times
[ i^ 2 +
dup 10 < if sp
dup echo
say ": "
repunitprimes echo
cr ]
- Output:
2: [ 2 3 5 7 13 17 19 31 61 89 107 127 521 607 ] 3: [ 3 7 13 71 103 541 ] 4: [ 2 ] 5: [ 3 7 11 13 47 127 149 181 619 929 ] 6: [ 2 3 7 29 71 127 271 509 ] 7: [ 5 13 131 149 ] 8: [ 3 ] 9: [ ] 10: [ 2 19 23 317 ] 11: [ 17 19 73 139 907 ] 12: [ 2 3 5 19 97 109 317 353 701 ] 13: [ 5 7 137 283 883 991 ] 14: [ 3 7 19 31 41 ] 15: [ 3 43 73 487 ] 16: [ 2 ]
Raku
my $limit = 2700;
say "Repunit prime digits (up to $limit) in:";
.put for (2..16).hyper(:1batch).map: -> $base {
$base.fmt("Base %2d: ") ~ (1..$limit).grep(&is-prime).grep( (1 x *).parse-base($base).is-prime )
}
- Output:
Repunit prime digits (up to 2700) in: Base 2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281 Base 3: 3 7 13 71 103 541 1091 1367 1627 Base 4: 2 Base 5: 3 7 11 13 47 127 149 181 619 929 Base 6: 2 3 7 29 71 127 271 509 1049 Base 7: 5 13 131 149 1699 Base 8: 3 Base 9: Base 10: 2 19 23 317 1031 Base 11: 17 19 73 139 907 1907 2029 Base 12: 2 3 5 19 97 109 317 353 701 Base 13: 5 7 137 283 883 991 1021 1193 Base 14: 3 7 19 31 41 2687 Base 15: 3 43 73 487 2579 Base 16: 2
And for my own amusement, also tested up to 2700.
Base 17: 3 5 7 11 47 71 419 Base 18: 2 Base 19: 19 31 47 59 61 107 337 1061 Base 20: 3 11 17 1487 Base 21: 3 11 17 43 271 Base 22: 2 5 79 101 359 857 Base 23: 5 Base 24: 3 5 19 53 71 653 661 Base 25: Base 26: 7 43 347 Base 27: 3 Base 28: 2 5 17 457 1423 Base 29: 5 151 Base 30: 2 5 11 163 569 1789 Base 31: 7 17 31 Base 32: Base 33: 3 197 Base 34: 13 1493 Base 35: 313 1297 Base 36: 2
RPL
≪ 0 1 4 ROLL START OVER * 1 + NEXT NIP ≫ 'REPUB' STO @ ( n b → Rb(n) ) ≪ 16 2 FOR b { } 2 1000 FOR n IF n b REPUB ISPRIME? THEN n + END NEXT -1 STEP "Done." ≫ 'TASK' STO
- Output:
16: {2} 15: {3 43 73 487} 14: {3 7 19 31 41} 13: {5 7 137 283 883 991} 12: {2 3 5 19 97 109 317 353 701} 11: {17 19 73 139 907} 10: {2 19 23 317} 9: { } 8: {3} 7: {5 13 131 149} 6: {2 3 7 29 71 127 271 509} 5: {3 7 11 13 47 127 149 181 619 929} 4: {2} 3: {3 7 13 71 103 541} 2: {2 3 5 7 13 17 19 31 61 89 107 127 521 607} 1: "Done."
Ruby
Ruby's standard lib 'Prime' is boring slow for this. GMP to the rescue. GMP bindings is a gem, not in std lib.
require 'prime'
require 'gmp'
(2..16).each do |base|
res = Prime.each(1000).select {|n| GMP::Z(("1" * n).to_i(base)).probab_prime? > 0}
puts "Base #{base}: #{res.join(" ")}"
end
- Output:
Base 2: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 Base 3: 3 7 13 71 103 541 Base 4: 2 Base 5: 3 7 11 13 47 127 149 181 619 929 Base 6: 2 3 7 29 71 127 271 509 Base 7: 5 13 131 149 Base 8: 3 Base 9: Base 10: 2 19 23 317 Base 11: 17 19 73 139 907 Base 12: 2 3 5 19 97 109 317 353 701 Base 13: 5 7 137 283 883 991 Base 14: 3 7 19 31 41 Base 15: 3 43 73 487 Base 16: 2
Scheme
This uses
Miller–Rabin primality test (Scheme)
, renamed, restructured, with a minor fix.
Took about 59 minutes to run.
Primality Test
; Test whether any integer is a probable prime.
(define prime<probably>?
(lambda (n)
; Fast modular exponentiation.
(define modexpt
(lambda (b e m)
(cond
((zero? e) 1)
((even? e) (modexpt (mod (* b b) m) (div e 2) m))
((odd? e) (mod (* b (modexpt b (- e 1) m)) m)))))
; Return multiple values s, d such that d is odd and 2^s * d = n.
(define split
(lambda (n)
(let recur ((s 0) (d n))
(if (odd? d)
(values s d)
(recur (+ s 1) (div d 2))))))
; Test whether the number a proves that n is composite.
(define composite-witness?
(lambda (n a)
(let*-values (((s d) (split (- n 1)))
((x) (modexpt a d n)))
(and (not (= x 1))
(not (= x (- n 1)))
(let try ((r (- s 1)))
(set! x (modexpt x 2 n))
(or (zero? r)
(= x 1)
(and (not (= x (- n 1)))
(try (- r 1)))))))))
; Test whether n > 2 is a Miller-Rabin pseudoprime, k trials.
(define pseudoprime?
(lambda (n k)
(or (zero? k)
(let ((a (+ 2 (random (- n 2)))))
(and (not (composite-witness? n a))
(pseudoprime? n (- k 1)))))))
; Compute and return Probable Primality using the Miller-Rabin algorithm.
(and (> n 1)
(or (= n 2)
(and (odd? n)
(pseudoprime? n 50))))))
The Task
; Return list of the Repunit Primes in the given base up to the given limit.
(define repunit_primes
(lambda (base limit)
(let loop ((count 2)
(value (1+ base)))
(cond ((> count limit)
'())
((and (prime<probably>? count) (prime<probably>? value))
(cons count (loop (1+ count) (+ value (expt base count)))))
(else
(loop (1+ count) (+ value (expt base count))))))))
; Show all the Repunit Primes up to 2700 digits for bases 2 through 16.
(let ((max-base 16)
(max-digits 2700))
(printf "~%Repunit Primes up to ~d digits for bases 2 through ~d:~%" max-digits max-base)
(do ((base 2 (1+ base)))
((> base max-base))
(printf "Base ~2d: ~a~%" base (repunit_primes base max-digits))))
- Output:
Repunit Primes up to 2700 digits for bases 2 through 16: Base 2: (2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281) Base 3: (3 7 13 71 103 541 1091 1367 1627) Base 4: (2) Base 5: (3 7 11 13 47 127 149 181 619 929) Base 6: (2 3 7 29 71 127 271 509 1049) Base 7: (5 13 131 149 1699) Base 8: (3) Base 9: () Base 10: (2 19 23 317 1031) Base 11: (17 19 73 139 907 1907 2029) Base 12: (2 3 5 19 97 109 317 353 701) Base 13: (5 7 137 283 883 991 1021 1193) Base 14: (3 7 19 31 41 2687) Base 15: (3 43 73 487 2579) Base 16: (2)
Sidef
var limit = 1000
say "Repunit prime digits (up to #{limit}) in:"
for n in (2..20) {
printf("Base %2d: %s\n", n,
{|k| is_prime((n**k - 1) / (n-1)) }.grep(1..limit))
}
- Output:
Base 2: [2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607] Base 3: [3, 7, 13, 71, 103, 541] Base 4: [2] Base 5: [3, 7, 11, 13, 47, 127, 149, 181, 619, 929] Base 6: [2, 3, 7, 29, 71, 127, 271, 509] Base 7: [5, 13, 131, 149] Base 8: [3] Base 9: [] Base 10: [2, 19, 23, 317] Base 11: [17, 19, 73, 139, 907] Base 12: [2, 3, 5, 19, 97, 109, 317, 353, 701] Base 13: [5, 7, 137, 283, 883, 991] Base 14: [3, 7, 19, 31, 41] Base 15: [3, 43, 73, 487] Base 16: [2] Base 17: [3, 5, 7, 11, 47, 71, 419] Base 18: [2] Base 19: [19, 31, 47, 59, 61, 107, 337] Base 20: [3, 11, 17]
Wren
An embedded program so we can use GMP as I know from experience that Wren-CLI (using BigInt) will not be able to complete this task in a reasonable time.
Still takes a while - 11 minutes 20 seconds to get up to base 36 with a limit of 2700.
/* Repunit_primes.wren */
import "./gmp" for Mpz
import "./math" for Int
import "./fmt" for Fmt
import "./str" for Str
var limit = 2700
var primes = Int.primeSieve(limit)
for (b in 2..36) {
var rPrimes = []
for (p in primes) {
var s = Mpz.fromStr(Str.repeat("1", p), b)
if (s.probPrime(15) > 0) rPrimes.add(p)
}
Fmt.print("Base $2d: $n", b, rPrimes)
}
- Output:
Base 2: [2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281] Base 3: [3, 7, 13, 71, 103, 541, 1091, 1367, 1627] Base 4: [2] Base 5: [3, 7, 11, 13, 47, 127, 149, 181, 619, 929] Base 6: [2, 3, 7, 29, 71, 127, 271, 509, 1049] Base 7: [5, 13, 131, 149, 1699] Base 8: [3] Base 9: [] Base 10: [2, 19, 23, 317, 1031] Base 11: [17, 19, 73, 139, 907, 1907, 2029] Base 12: [2, 3, 5, 19, 97, 109, 317, 353, 701] Base 13: [5, 7, 137, 283, 883, 991, 1021, 1193] Base 14: [3, 7, 19, 31, 41, 2687] Base 15: [3, 43, 73, 487, 2579] Base 16: [2] Base 17: [3, 5, 7, 11, 47, 71, 419] Base 18: [2] Base 19: [19, 31, 47, 59, 61, 107, 337, 1061] Base 20: [3, 11, 17, 1487] Base 21: [3, 11, 17, 43, 271] Base 22: [2, 5, 79, 101, 359, 857] Base 23: [5] Base 24: [3, 5, 19, 53, 71, 653, 661] Base 25: [] Base 26: [7, 43, 347] Base 27: [3] Base 28: [2, 5, 17, 457, 1423] Base 29: [5, 151] Base 30: [2, 5, 11, 163, 569, 1789] Base 31: [7, 17, 31] Base 32: [] Base 33: [3, 197] Base 34: [13, 1493] Base 35: [313, 1297] Base 36: [2]