Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,136 +0,0 @@
|
|||
-- Rosetta Code Task written in Ada
|
||||
-- Cuban primes (related to "Cubes", not "Cubans")
|
||||
-- https://rosettacode.org/wiki/Cuban_primes
|
||||
-- July 2024, R. B. E.
|
||||
|
||||
-- Using this Cuban Primes Definition: primes of the form: n^3 - (n-1)^3.
|
||||
|
||||
-- ToDo:
|
||||
-- Commatize the results (an advanced subtask)
|
||||
-- Could replace the "activity dots" generated during the big calculations with a spinner
|
||||
|
||||
-- NOTE: Using GNAT Big_Numbers package.
|
||||
-- Takes a very long time to generate the 100_000th cuban prime: about 75 minutes on a M1 Mac Mini.
|
||||
|
||||
pragma Ada_2022;
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
|
||||
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
|
||||
with Ada.Numerics.Big_Numbers.Big_Integers; use Ada.Numerics.Big_Numbers.Big_Integers;
|
||||
with Ada.Strings; use Ada.Strings;
|
||||
with Ada.Strings.Fixed; use Ada.Strings.Fixed;
|
||||
with Ada.Strings.Maps; use Ada.Strings.Maps;
|
||||
with Ada.Real_Time; use Ada.Real_Time;
|
||||
|
||||
procedure Cuban_Primes is
|
||||
|
||||
function Is_Prime (A : Positive) return Boolean is
|
||||
D : Positive;
|
||||
begin
|
||||
if A < 2 then
|
||||
return False;
|
||||
end if;
|
||||
if A in 2 .. 3 then
|
||||
return True;
|
||||
end if;
|
||||
if A mod 2 = 0 then
|
||||
return False;
|
||||
end if;
|
||||
if A mod 3 = 0 then
|
||||
return False;
|
||||
end if;
|
||||
D := 5;
|
||||
while D * D <= A loop
|
||||
if A mod D = 0 then
|
||||
return False;
|
||||
end if;
|
||||
D := D + 2;
|
||||
if A mod D = 0 then
|
||||
return False;
|
||||
end if;
|
||||
D := D + 4;
|
||||
end loop;
|
||||
return True;
|
||||
end Is_Prime;
|
||||
|
||||
function Is_Prime (A : Big_Natural) return Boolean is
|
||||
D : Big_Natural;
|
||||
B0 : constant Big_Natural := To_Big_Integer (0);
|
||||
B1 : constant Big_Natural := To_Big_Integer (1);
|
||||
B2 : constant Big_Natural := To_Big_Integer (2);
|
||||
B3 : constant Big_Natural := To_Big_Integer (3);
|
||||
B4 : constant Big_Natural := To_Big_Integer (4);
|
||||
B5 : constant Big_Natural := To_Big_Integer (5);
|
||||
begin
|
||||
if A < B2 then
|
||||
return False;
|
||||
end if;
|
||||
if (A = B2) or (A = B3) then
|
||||
return True;
|
||||
end if;
|
||||
if A mod B2 = B0 then
|
||||
return False;
|
||||
end if;
|
||||
if A mod B3 = B0 then
|
||||
return False;
|
||||
end if;
|
||||
D := B5;
|
||||
while D * D <= A loop
|
||||
if A mod D = B0 then
|
||||
return False;
|
||||
end if;
|
||||
D := D + B2;
|
||||
if A mod D = B0 then
|
||||
return False;
|
||||
end if;
|
||||
D := D + B4;
|
||||
end loop;
|
||||
return True;
|
||||
end Is_Prime;
|
||||
|
||||
Cuban_Count : Natural := 1;
|
||||
Candidate : Natural;
|
||||
Big_Candidate : Big_Natural;
|
||||
Max_Cuban_for_the_Table : constant Integer := 200;
|
||||
Max_Cuban_below_the_Table : constant Integer := 100_000;
|
||||
Start_Time, Stop_Time : Time;
|
||||
Elapsed_Time : Time_Span;
|
||||
|
||||
begin
|
||||
Put ("The first ");
|
||||
Put (Max_Cuban_for_the_Table, 1);
|
||||
Put_Line (" Cuban Primes...");
|
||||
for I in 1 .. Integer'Last loop
|
||||
Candidate := ((I + 1) ** 3) - (I ** 3);
|
||||
if Is_Prime (Candidate) then
|
||||
Put (Candidate, 8);
|
||||
if ((Cuban_Count rem 14) = 0) then
|
||||
New_Line;
|
||||
end if;
|
||||
Cuban_Count := Cuban_Count + 1;
|
||||
end if;
|
||||
exit when Cuban_Count > Max_Cuban_for_the_Table;
|
||||
end loop;
|
||||
New_Line (2);
|
||||
Cuban_Count := 1;
|
||||
Start_Time := Clock;
|
||||
Put ("The ");
|
||||
Put (Max_Cuban_below_the_Table, 1);
|
||||
Put ("th Cuban Prime is: ");
|
||||
for I in 1 .. Integer'Last loop
|
||||
Big_Candidate := (((To_Big_Integer (I) + 1) ** 3) - (To_Big_Integer (I) ** 3));
|
||||
if Is_Prime (Big_Candidate) then
|
||||
Cuban_Count := Cuban_Count + 1;
|
||||
if (Cuban_Count rem 10_000) = 0 then
|
||||
Put (".");
|
||||
end if;
|
||||
end if;
|
||||
exit when Cuban_Count = Max_Cuban_below_the_Table;
|
||||
end loop;
|
||||
New_Line;
|
||||
Put (Trim (To_String (Big_Candidate), Right));
|
||||
Stop_Time := Clock;
|
||||
Elapsed_Time := Stop_Time - Start_Time;
|
||||
New_Line;
|
||||
Put_Line ("Elapsed time to calculate: " & Duration'Image (To_Duration (Elapsed_Time)) & " seconds");
|
||||
end Cuban_Primes;
|
||||
|
|
@ -1,34 +1,32 @@
|
|||
(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>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">np</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span>
|
||||
<span style="color: #000000;">i</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span>
|
||||
<span style="color: #004080;">mpz</span> <span style="color: #000000;">p3</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">i3</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(),</span>
|
||||
<span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(),</span>
|
||||
<span style="color: #000000;">pn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">()</span>
|
||||
with javascript_semantics
|
||||
include mpfr.e
|
||||
integer np = 0,
|
||||
i = 2
|
||||
mpz p3 = mpz_init(1*1*1),
|
||||
i3 = mpz_init(),
|
||||
p = mpz_init(),
|
||||
pn = mpz_init()
|
||||
|
||||
<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 200 cuban primes are:\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">first200</span> <span style="color: #0000FF;">=</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: #008080;">constant</span> <span style="color: #000000;">lim</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">JS</span><span style="color: #0000FF;">?</span><span style="color: #000000;">10000</span><span style="color: #0000FF;">:</span><span style="color: #000000;">100000</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">np</span><span style="color: #0000FF;"><</span><span style="color: #000000;">lim</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #7060A8;">mpz_ui_pow_ui</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p3</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;">p</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">mpz_set</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">np</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">np</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">200</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">first200</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">first200</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%,9d"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">mpz_get_integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pn</span><span style="color: #0000FF;">)))</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">np</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</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;">"%s\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">first200</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">10</span><span style="color: #0000FF;">..-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]))</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #7060A8;">mpz_set</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i3</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">i</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;">"\nThe %,dth cuban prime is %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">np</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">mpz_get_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">comma_fill</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)})</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #000000;">p3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_free</span><span style="color: #0000FF;">({</span><span style="color: #000000;">p3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">})</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>
|
||||
<!--
|
||||
printf(1,"The first 200 cuban primes are:\n")
|
||||
sequence first200 = {}
|
||||
atom t0 = time()
|
||||
constant lim = iff(platform()=JS?10000:100000)
|
||||
while np<lim do
|
||||
mpz_ui_pow_ui(i3,i,3)
|
||||
mpz_sub(p,i3,p3)
|
||||
if mpz_prime(p) then
|
||||
mpz_set(pn,p)
|
||||
np += 1
|
||||
if np<=200 then
|
||||
first200 = append(first200,sprintf("%,9d",mpz_get_integer(pn)))
|
||||
if mod(np,10)=0 then
|
||||
printf(1,"%s\n",join(first200[-10..-1]))
|
||||
end if
|
||||
end if
|
||||
end if
|
||||
mpz_set(p3,i3)
|
||||
i += 1
|
||||
end while
|
||||
printf(1,"\nThe %,dth cuban prime is %s\n",{np,mpz_get_str(pn,comma_fill:=true)})
|
||||
{p3,i3,p} = mpz_free({p3,i3,p})
|
||||
?elapsed(time()-t0)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
-- 28 Jul 2025
|
||||
include Settings
|
||||
-- 23 Aug 2025
|
||||
include Setting
|
||||
numeric digits 20
|
||||
|
||||
say 'CUBAN PRIMES'
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue