Mertens function: Difference between revisions

Added solution for Action!
(Added 11l)
(Added solution for Action!)
Line 415:
M(N) is zero 92 times.
M(N) crosses zero 59 times.</pre>
 
=={{header|Action!}}==
Calculations on a real Atari 8-bit computer take quite long time. It is recommended to use an emulator capable with increasing speed of Atari CPU.
{{libheader|Action! Tool Kit}}
<lang Action!>INCLUDE "D2:PRINTF.ACT" ;from the Action! Tool Kit
 
PROC MertensNumbers(INT ARRAY m INT count)
INT n,k
 
m(1)=1
FOR n=2 TO count
DO
m(n)=1
FOR k=2 TO n
DO
m(n)==-m(n/k)
OD
OD
RETURN
 
PROC PrintMertens(INT ARRAY m INT count)
CHAR ARRAY s(6)
INT i,col
 
PrintF("First %I Mertens numbers:%E ",count)
col=1
FOR i=1 TO count
DO
StrI(m(i),s)
PrintF("%3S",s)
col==+1
IF col=10 THEN
col=0 PutE()
FI
OD
RETURN
 
PROC Main()
DEFINE MAX="1001"
INT ARRAY m(MAX)
INT i,zeroCnt=[0],crossCnt=[0],prev=[0]
 
Put(125) PutE() ;clear the screen
PrintF("Calculation of Mertens numbers,%E please wait...")
MertensNumbers(m,MAX)
 
Put(125) PutE() ;clear the screen
PrintMertens(m,99)
 
FOR i=1 TO MAX
DO
IF m(i)=0 THEN
zeroCnt==+1
IF prev THEN
crossCnt==+1
FI
FI
prev=m(i)
OD
PrintF("%EM(n) is zero %I times for 1<=n<=%I.%E",zeroCnt,MAX-1)
PrintF("%EM(n) crosses zero %I times for 1<=n<=%I.%E",crossCnt,MAX-1)
RETURN</lang>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Mertens_function.png Screenshot from Atari 8-bit computer]
<pre>
First 99 Mertens numbers:
1 0 -1 -1 -2 -1 -2 -2 -2
-1 -2 -2 -3 -2 -1 -1 -2 -2 -3
-3 -2 -1 -2 -2 -2 -1 -1 -1 -2
-3 -4 -4 -3 -2 -1 -1 -2 -1 0
0 -1 -2 -3 -3 -3 -2 -3 -3 -3
-3 -2 -2 -3 -3 -2 -2 -1 0 -1
-1 -2 -1 -1 -1 0 -1 -2 -2 -1
-2 -3 -3 -4 -3 -3 -3 -2 -3 -4
-4 -4 -3 -4 -4 -3 -2 -1 -1 -2
-2 -1 -1 0 1 2 2 1 1 1
 
M(n) is zero 92 times for 1<=n<=1000.
 
M(n) crosses zero 59 times for 1<=n<=1000.
</pre>
 
=={{header|ALGOL 68}}==
Anonymous user