Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,6 +1,6 @@
|
|||
perms: function [n][
|
||||
str: repeat to :string n 2
|
||||
result: new []
|
||||
result: []
|
||||
lim: dec size digits n
|
||||
loop 0..lim 'd ->
|
||||
'result ++ slice str d lim+d
|
||||
|
|
@ -8,7 +8,7 @@ perms: function [n][
|
|||
return to [:integer] result
|
||||
]
|
||||
|
||||
circulars: new []
|
||||
circulars: []
|
||||
|
||||
circular?: function [x][
|
||||
if not? prime? x -> return false
|
||||
|
|
|
|||
|
|
@ -1,166 +0,0 @@
|
|||
program CircularPrimes;
|
||||
//nearly the way it is done:
|
||||
//http://www.worldofnumbers.com/circular.htm
|
||||
//base 4 counter to create numbers with first digit is the samallest used.
|
||||
//check if numbers are tested before and reduce gmp-calls by checking with prime 3,7
|
||||
|
||||
{$IFDEF FPC}
|
||||
{$MODE DELPHI}{$OPTIMIZATION ON,ALL}
|
||||
uses
|
||||
Sysutils,gmp;
|
||||
{$ENDIF}
|
||||
{$IFDEF Delphi}
|
||||
uses
|
||||
System.Sysutils,?gmp?;
|
||||
{$ENDIF}
|
||||
|
||||
{$IFDEF WINDOWS}
|
||||
{$APPTYPE CONSOLE}
|
||||
{$ENDIF}
|
||||
const
|
||||
MAXCNTOFDIGITS = 14;
|
||||
MAXDGTVAL = 3;
|
||||
conv : array[0..MAXDGTVAL+1] of byte = (9,7,3,1,0);
|
||||
type
|
||||
tDigits = array[0..23] of byte;
|
||||
tUint64 = NativeUint;
|
||||
var
|
||||
mpz : mpz_t;
|
||||
digits,
|
||||
revDigits : tDigits;
|
||||
CheckNum : array[0..19] of tUint64;
|
||||
Found : array[0..23] of tUint64;
|
||||
Pot_ten,Count,CountNumCyc,CountNumPrmTst : tUint64;
|
||||
|
||||
procedure CheckOne(MaxIdx:integer);
|
||||
var
|
||||
Num : Uint64;
|
||||
i : integer;
|
||||
begin
|
||||
i:= MaxIdx;
|
||||
repeat
|
||||
inc(CountNumPrmTst);
|
||||
num := CheckNum[i];
|
||||
mpz_set_ui(mpz,Num);
|
||||
If mpz_probab_prime_p(mpz,3)=0then
|
||||
EXIT;
|
||||
dec(i);
|
||||
until i < 0;
|
||||
Found[Count] := CheckNum[0];
|
||||
inc(count);
|
||||
end;
|
||||
|
||||
function CycleNum(MaxIdx:integer):Boolean;
|
||||
//first create circular numbers to minimize prime checks
|
||||
var
|
||||
cycNum,First,P10 : tUint64;
|
||||
i,j,cv : integer;
|
||||
Begin
|
||||
i:= MaxIdx;
|
||||
j := 0;
|
||||
First := 0;
|
||||
repeat
|
||||
cv := conv[digits[i]];
|
||||
dec(i);
|
||||
First := First*10+cv;
|
||||
revDigits[j]:= cv;
|
||||
inc(j);
|
||||
until i < 0;
|
||||
// if num is divisible by 3 then cycle numbers also divisible by 3 same sum of digits
|
||||
IF First MOD 3 = 0 then
|
||||
EXIT(false);
|
||||
If First mod 7 = 0 then
|
||||
EXIT(false);
|
||||
|
||||
//if one of the cycled number must have been tested before break
|
||||
P10 := Pot_ten;
|
||||
i := 0;
|
||||
j := 0;
|
||||
CheckNum[j] := First;
|
||||
cycNum := First;
|
||||
repeat
|
||||
inc(CountNumCyc);
|
||||
cv := revDigits[i];
|
||||
inc(j);
|
||||
cycNum := (cycNum - cv*P10)*10+cv;
|
||||
//num was checked before
|
||||
if cycNum < First then
|
||||
EXIT(false);
|
||||
if cycNum mod 7 = 0 then
|
||||
EXIT(false);
|
||||
CheckNum[j] := cycNum;
|
||||
inc(i);
|
||||
until i >= MaxIdx;
|
||||
EXIT(true);
|
||||
end;
|
||||
|
||||
var
|
||||
T0: Int64;
|
||||
|
||||
idx,MaxIDx,dgt,MinDgt : NativeInt;
|
||||
begin
|
||||
T0 := GetTickCount64;
|
||||
mpz_init(mpz);
|
||||
|
||||
fillchar(digits,Sizeof(digits),chr(MAXDGTVAL));
|
||||
Count :=0;
|
||||
For maxIdx := 2 to 10 do
|
||||
if maxidx in[2,3,5,7] then
|
||||
begin
|
||||
Found[Count]:= maxIdx;
|
||||
inc(count);
|
||||
end;
|
||||
|
||||
Pot_ten := 10;
|
||||
maxIdx := 1;
|
||||
idx := 0;
|
||||
MinDgt := MAXDGTVAL;
|
||||
repeat
|
||||
if CycleNum(MaxIdx) then
|
||||
CheckOne(MaxIdx);
|
||||
idx := 0;
|
||||
repeat
|
||||
dgt := digits[idx]-1;
|
||||
if dgt >=0 then
|
||||
break;
|
||||
digits[idx] := MinDgt;
|
||||
inc(idx);
|
||||
until idx >MAXCNTOFDIGITS-1;
|
||||
|
||||
if idx > MAXCNTOFDIGITS-1 then
|
||||
BREAK;
|
||||
|
||||
if idx<=MaxIDX then
|
||||
begin
|
||||
digits[idx] := dgt;
|
||||
//change all to leading digit
|
||||
if idx=MaxIDX then
|
||||
Begin
|
||||
For MinDgt := 0 to idx do
|
||||
digits[MinDgt]:= dgt;
|
||||
minDgt := dgt;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
minDgt := MAXDGTVAL;
|
||||
For maxidx := 0 to idx do
|
||||
digits[MaxIdx] := MAXDGTVAL;
|
||||
Maxidx := idx;
|
||||
Pot_ten := Pot_ten*10;
|
||||
writeln(idx:7,count:7,CountNumCyc:16,CountNumPrmTst:12,GetTickCount64-T0:8);
|
||||
end;
|
||||
until false;
|
||||
writeln(idx:7,count:7,CountNumCyc:16,CountNumPrmTst:12,GetTickCount64-T0:8);
|
||||
T0 := GetTickCount64-T0;
|
||||
|
||||
For idx := 0 to count-2 do
|
||||
write(Found[idx],',');
|
||||
writeln(Found[count-1]);
|
||||
|
||||
writeln('It took ',T0,' ms ','to check ',MAXCNTOFDIGITS,' decimals');
|
||||
mpz_clear(mpz);
|
||||
{$IFDEF WINDOWS}
|
||||
readln;
|
||||
{$ENDIF}
|
||||
end.
|
||||
|
|
@ -1,39 +1,33 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">circular</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">len</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)),</span>
|
||||
<span style="color: #000000;">pow</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">len</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">p0</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">p</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">len</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pow</span><span style="color: #0000FF;">*</span><span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)+</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">/</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">p</span><span style="color: #0000FF;"><</span><span style="color: #000000;">p0</span> <span style="color: #008080;">or</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">is_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">false</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #004600;">true</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
with javascript_semantics
|
||||
function circular(integer p)
|
||||
integer len = length(sprintf("%d",p)),
|
||||
pow = power(10,len-1),
|
||||
p0 = p
|
||||
for i=1 to len-1 do
|
||||
p = pow*remainder(p,10)+floor(p/10)
|
||||
if p<p0 or not is_prime(p) then return false end if
|
||||
end for
|
||||
return true
|
||||
end function
|
||||
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">)<</span><span style="color: #000000;">19</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">circular</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">p</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The first 19 circular primes are:\n%v\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">c</span><span style="color: #0000FF;">})</span>
|
||||
sequence c = {}
|
||||
integer n = 1
|
||||
while length(c)<19 do
|
||||
integer p = get_prime(n)
|
||||
if circular(p) then c &= p end if
|
||||
n += 1
|
||||
end while
|
||||
printf(1,"The first 19 circular primes are:\n%v\n\n",{c})
|
||||
|
||||
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">repunit</span><span style="color: #0000FF;">(</span><span style="color: #004080;">mpz</span> <span style="color: #000000;">z</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_set_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'1'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">))</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
|
||||
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">7</span>
|
||||
<span style="color: #004080;">mpz</span> <span style="color: #000000;">z</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">)<</span><span style="color: #000000;">4</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">repunit</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mpz_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"R(%d)"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">))</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">n</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The next 4 circular primes, in repunit format, are:\n%s\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">)})</span>
|
||||
<!--
|
||||
include mpfr.e
|
||||
c = {}
|
||||
n = 7
|
||||
mpz z = mpz_init()
|
||||
while length(c)<4 do
|
||||
mpz_set_str(z,repeat('1',n))
|
||||
if mpz_prime(z) then
|
||||
c = append(c,sprintf("R(%d)",n))
|
||||
end if
|
||||
n += 1
|
||||
end while
|
||||
printf(1,"The next 4 circular primes, in repunit format, are:\n%s\n\n",{join(c)})
|
||||
|
|
|
|||
|
|
@ -1,11 +1,7 @@
|
|||
-->
|
||||
<span style="color: #008080;">constant</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">5003</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">9887</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">15073</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">25031</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">35317</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">49081</span><span style="color: #0000FF;">}</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The following repunits are probably circular primes:\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">ti</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">repunit</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">bool</span> <span style="color: #000000;">bPrime</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">z</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"R(%d) : %t (%s)\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">bPrime</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">elapsed</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">)})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<!--
|
||||
printf(1,"The following repunits are probably circular primes:\n")
|
||||
for n in {5003, 9887, 15073, 25031, 35317, 49081} do
|
||||
atom start = time()
|
||||
mpz_set_str(z,repeat('1',n))
|
||||
bool bPrime = mpz_prime(z,1)
|
||||
printf(1,"R(%d) : %t (%s)\n", {n, bPrime, elapsed(time()-start)})
|
||||
end for
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
-- 28 Jul 2025
|
||||
include Settings
|
||||
-- 23 Aug 2025
|
||||
include Setting
|
||||
|
||||
say 'CIRCULAR PRIMES'
|
||||
say version
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue