Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,3 @@
---
from: http://rosettacode.org/wiki/Chowla_numbers
note: Prime Numbers

View file

@ -0,0 +1,73 @@
Chowla numbers are also known as:
::*   Chowla's function
::*   chowla numbers
::*   the chowla function
::*   the chowla number
::*   the chowla sequence
The chowla number of &nbsp; <big>'''n'''</big> &nbsp; is &nbsp; (as defined by Chowla's function):
::* &nbsp; the sum of the divisors of &nbsp; <big>'''n'''</big> &nbsp; &nbsp; excluding unity and &nbsp; <big>'''n'''</big>
::* &nbsp; where &nbsp; <big>'''n'''</big> &nbsp; is a positive integer
The sequence is named after &nbsp; Sarvadaman D. S. Chowla, &nbsp; (22 October 1907 ──► 10 December 1995),
<br>a London born Indian American mathematician specializing in ''number theory''.
German mathematician Carl Friedrich Gauss (1777─1855) said:
"Mathematics is the queen of the sciences ─ and number theory is the queen of mathematics".
;Definitions:
Chowla numbers can also be expressed as:
<big>
chowla(<big>'''n'''</big>) = sum of divisors of <big>'''n'''</big> excluding unity and <big>'''n'''</big>
chowla(<big>'''n'''</big>) = sum( divisors(<big>'''n'''</big>)) <big>'''- 1 - n''' </big>
chowla(<big>'''n'''</big>) = sum( properDivisors(<big>'''n'''</big>)) <big>'''- 1''' </big>
chowla(<big>'''n'''</big>) = sum(aliquotDivisors(<big>'''n'''</big>)) <big>'''- 1''' </big>
chowla(<big>'''n'''</big>) = aliquot(<big>'''n'''</big>) <big>'''- 1''' </big>
chowla(<big>'''n'''</big>) = sigma(<big>'''n'''</big>) <big>'''- 1 - n''' </big>
chowla(<big>'''n'''</big>) = sigmaProperDivisiors(<big>'''n'''</big>) <big>'''- 1''' </big>
&nbsp;
chowla(<big>'''a'''*'''b'''</big>) = <big>'''a + b'''</big>, &nbsp; ''if'' <big>'''a'''</big> and <big>'''b'''</big> are distinct primes
if chowla(<big>'''n'''</big>) = <big>'''0'''</big>,&nbsp; and <big>'''n > 1'''</big>, then <big>'''n'''</big> is prime
if chowla(<big>'''n'''</big>) = <big>'''n - 1'''</big>, and <big>'''n > 1'''</big>, then <big>'''n'''</big> is a perfect number
</big>
;Task:
::* &nbsp; create a &nbsp; '''chowla''' &nbsp; function that returns the &nbsp; '''chowla number''' &nbsp; for a positive integer &nbsp; '''n'''
::* &nbsp; Find and display &nbsp; (1 per line) &nbsp; for the 1<sup>st</sup> &nbsp; '''37''' &nbsp; integers:
::::* &nbsp; the integer &nbsp; (the index)
::::* &nbsp; the chowla number for that integer
::* &nbsp; For finding primes, use the &nbsp; '''chowla''' &nbsp; function to find values of zero
::* &nbsp; Find and display the &nbsp; ''count'' &nbsp; of the primes up to &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; '''100'''
::* &nbsp; Find and display the &nbsp; ''count'' &nbsp; of the primes up to &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '''1,000'''
::* &nbsp; Find and display the &nbsp; ''count'' &nbsp; of the primes up to &nbsp; &nbsp; &nbsp; &nbsp; '''10,000'''
::* &nbsp; Find and display the &nbsp; ''count'' &nbsp; of the primes up to &nbsp; &nbsp; &nbsp; '''100,000'''
::* &nbsp; Find and display the &nbsp; ''count'' &nbsp; of the primes up to &nbsp;&nbsp; '''1,000,000'''
::* &nbsp; Find and display the &nbsp; ''count'' &nbsp; of the primes up to&nbsp; '''10,000,000'''
::* &nbsp; For finding perfect numbers, use the &nbsp; '''chowla''' &nbsp; function to find values of &nbsp; '''n - 1'''
::* &nbsp; Find and display all &nbsp; perfect numbers &nbsp; up to &nbsp; '''35,000,000'''
::* &nbsp; use commas within appropriate numbers
::* &nbsp; show all output here
;Related tasks:
:* &nbsp; [[Totient_function| totient function]]
:* &nbsp; [[Perfect_numbers| perfect numbers]]
:* &nbsp; [[Proper divisors]]
:* &nbsp; [[Sieve of Eratosthenes]]
;See also:
:* &nbsp; the OEIS entry for &nbsp; [http://oeis.org/A048050 A48050 Chowla's function].
<br><br>

View file

@ -0,0 +1,38 @@
F chowla(n)
V sum = 0
V i = 2
L i * i <= n
I n % i == 0
sum += i
V j = n I/ i
I i != j
sum += j
i++
R sum
L(n) 1..37
print(chowla(n) = chowla(n))
V count = 0
V power = 100
L(n) 2..10'000'000
I chowla(n) == 0
count++
I n % power == 0
print(There are count primes < power)
power *= 10
count = 0
V limit = 350'000'000
V k = 2
V kk = 3
L
V p = k * kk
I p > limit
L.break
I chowla(p) == p - 1
print(p is a perfect number)
count++
k = kk + 1
kk += k
print(There are count perfect numbers < limit)

View file

@ -0,0 +1,38 @@
BEGIN # find some Chowla numbers ( Chowla n = sum of divisors of n exclusing n and 1 ) #
# returs the Chowla number of n #
PROC chowla = ( INT n )INT:
BEGIN
INT sum := 0;
FOR i FROM 2 WHILE i * i <= n DO
IF n MOD i = 0 THEN
INT j = n OVER i;
sum +:= i + IF i = j THEN 0 ELSE j FI
FI
OD;
sum
END # chowla # ;
FOR n TO 37 DO print( ( "chowla(", whole( n, 0 ), ") = ", whole( chowla( n ), 0 ), newline ) ) OD;
INT count := 0, power := 100;
FOR n FROM 2 TO 10 000 000 DO
IF chowla( n ) = 0 THEN count +:= 1 FI;
IF n MOD power = 0 THEN
print( ( "There are ", whole( count, 0 ), " primes < ", whole( power, 0 ), newline ) );
power *:= 10
FI
OD;
count := 0;
INT limit = 350 000 000;
INT k := 2, kk := 3;
WHILE INT p = k * kk;
p <= limit
DO
IF chowla( p ) = p - 1 THEN
print( ( whole( p, 0 ), " is a perfect number", newline ) );
count +:= 1
FI;
k := kk + 1; kk +:= k
OD;
print( ( "There are ", whole( count, 0 ), " perfect numbers < ", whole( limit, 0 ), newline ) )
END

View file

@ -0,0 +1,75 @@
# syntax: GAWK -f CHOWLA_NUMBERS.AWK
# converted from Go
BEGIN {
for (i=1; i<=37; i++) {
printf("chowla(%2d) = %s\n",i,chowla(i))
}
printf("\nCount of primes up to:\n")
count = 1
limit = 1e7
sieve(limit)
power = 100
for (i=3; i<limit; i+=2) {
if (!c[i]) {
count++
}
if (i == power-1) {
printf("%10s = %s\n",commatize(power),commatize(count))
power *= 10
}
}
printf("\nPerfect numbers:")
count = 0
limit = 35000000
k = 2
kk = 3
while (1) {
if ((p = k * kk) > limit) {
break
}
if (chowla(p) == p-1) {
printf(" %s",commatize(p))
count++
}
k = kk + 1
kk += k
}
printf("\nThere are %d perfect numbers <= %s\n",count,commatize(limit))
exit(0)
}
function chowla(n, i,j,sum) {
if (n < 1 || n != int(n)) {
return sprintf("%s is invalid",n)
}
for (i=2; i*i<=n; i++) {
if (n%i == 0) {
j = n / i
sum += (i == j) ? i : i + j
}
}
return(sum+0)
}
function commatize(x, num) {
if (x < 0) {
return "-" commatize(-x)
}
x = int(x)
num = sprintf("%d.",x)
while (num ~ /^[0-9][0-9][0-9][0-9]/) {
sub(/[0-9][0-9][0-9][,.]/,",&",num)
}
sub(/\.$/,"",num)
return(num)
}
function sieve(limit, i,j) {
for (i=1; i<=limit; i++) {
c[i] = 0
}
for (i=3; i*3<limit; i+=2) {
if (!c[i] && chowla(i) == 0) {
for (j=3*i; j<limit; j+=2*i) {
c[j] = 1
}
}
}
}

View file

@ -0,0 +1,70 @@
with Ada.Text_IO;
procedure Chowla_Numbers is
function Chowla (N : Positive) return Natural is
Sum : Natural := 0;
I : Positive := 2;
J : Positive;
begin
while I * I <= N loop
if N mod I = 0 then
J := N / I;
Sum := Sum + I + (if I = J then 0 else J);
end if;
I := I + 1;
end loop;
return Sum;
end Chowla;
procedure Put_37_First is
use Ada.Text_IO;
begin
for A in Positive range 1 .. 37 loop
Put_Line ("chowla(" & A'Image & ") = " & Chowla (A)'Image);
end loop;
end Put_37_First;
procedure Put_Prime is
use Ada.Text_IO;
Count : Natural := 0;
Power : Positive := 100;
begin
for N in Positive range 2 .. 10_000_000 loop
if Chowla (N) = 0 then
Count := Count + 1;
end if;
if N mod Power = 0 then
Put_Line ("There is " & Count'Image & " primes < " & Power'Image);
Power := Power * 10;
end if;
end loop;
end Put_Prime;
procedure Put_Perfect is
use Ada.Text_IO;
Count : Natural := 0;
Limit : constant := 350_000_000;
K : Natural := 2;
Kk : Natural := 3;
P : Natural;
begin
loop
P := K * Kk;
exit when P > Limit;
if Chowla (P) = P - 1 then
Put_Line (P'Image & " is a perfect number");
Count := Count + 1;
end if;
K := Kk + 1;
Kk := Kk + K;
end loop;
Put_Line ("There are " & Count'Image & " perfect numbers < " & Limit'Image);
end Put_Perfect;
begin
Put_37_First;
Put_Prime;
Put_Perfect;
end Chowla_Numbers;

View file

@ -0,0 +1,22 @@
chowla: function [n]-> sum remove remove factors n 1 n
countPrimesUpTo: function [limit][
count: 1
loop 3.. .step: 2 limit 'x [
if zero? chowla x -> count: count + 1
]
return count
]
loop 1..37 'i -> print [i "=>" chowla i]
print ""
loop [100 1000 10000 100000 1000000 10000000] 'lim [
print ["primes up to" lim "=>" countPrimesUpTo lim]
]
print ""
print "perfect numbers up to 35000000:"
i: 2
while [i < 35000000][
if (chowla i) = i - 1 -> print i
i: i + 2
]

View file

@ -0,0 +1,57 @@
#include <vector>
#include <iostream>
using namespace std;
int chowla(int n)
{
int sum = 0;
for (int i = 2, j; i * i <= n; i++)
if (n % i == 0) sum += i + (i == (j = n / i) ? 0 : j);
return sum;
}
vector<bool> sieve(int limit)
{
// True denotes composite, false denotes prime.
// Only interested in odd numbers >= 3
vector<bool> c(limit);
for (int i = 3; i * 3 < limit; i += 2)
if (!c[i] && (chowla(i) == 0))
for (int j = 3 * i; j < limit; j += 2 * i)
c[j] = true;
return c;
}
int main()
{
cout.imbue(locale(""));
for (int i = 1; i <= 37; i++)
cout << "chowla(" << i << ") = " << chowla(i) << "\n";
int count = 1, limit = (int)(1e7), power = 100;
vector<bool> c = sieve(limit);
for (int i = 3; i < limit; i += 2)
{
if (!c[i]) count++;
if (i == power - 1)
{
cout << "Count of primes up to " << power << " = "<< count <<"\n";
power *= 10;
}
}
count = 0; limit = 35000000;
int k = 2, kk = 3, p;
for (int i = 2; ; i++)
{
if ((p = k * kk) > limit) break;
if (chowla(p) == p - 1)
{
cout << p << " is a number that is perfect\n";
count++;
}
k = kk + 1; kk += k;
}
cout << "There are " << count << " perfect numbers <= 35,000,000\n";
return 0;
}

View file

@ -0,0 +1,59 @@
using System;
namespace chowla_cs
{
class Program
{
static int chowla(int n)
{
int sum = 0;
for (int i = 2, j; i * i <= n; i++)
if (n % i == 0) sum += i + (i == (j = n / i) ? 0 : j);
return sum;
}
static bool[] sieve(int limit)
{
// True denotes composite, false denotes prime.
// Only interested in odd numbers >= 3
bool[] c = new bool[limit];
for (int i = 3; i * 3 < limit; i += 2)
if (!c[i] && (chowla(i) == 0))
for (int j = 3 * i; j < limit; j += 2 * i)
c[j] = true;
return c;
}
static void Main(string[] args)
{
for (int i = 1; i <= 37; i++)
Console.WriteLine("chowla({0}) = {1}", i, chowla(i));
int count = 1, limit = (int)(1e7), power = 100;
bool[] c = sieve(limit);
for (int i = 3; i < limit; i += 2)
{
if (!c[i]) count++;
if (i == power - 1)
{
Console.WriteLine("Count of primes up to {0,10:n0} = {1:n0}", power, count);
power *= 10;
}
}
count = 0; limit = 35000000;
int k = 2, kk = 3, p;
for (int i = 2; ; i++)
{
if ((p = k * kk) > limit) break;
if (chowla(p) == p - 1)
{
Console.WriteLine("{0,10:n0} is a number that is perfect", p);
count++;
}
k = kk + 1; kk += k;
}
Console.WriteLine("There are {0} perfect numbers <= 35,000,000", count);
if (System.Diagnostics.Debugger.IsAttached) Console.ReadKey();
}
}
}

View file

@ -0,0 +1,32 @@
#include <stdio.h>
unsigned chowla(const unsigned n) {
unsigned sum = 0;
for (unsigned i = 2, j; i * i <= n; i ++) if (n % i == 0) sum += i + (i == (j = n / i) ? 0 : j);
return sum;
}
int main(int argc, char const *argv[]) {
unsigned a;
for (unsigned n = 1; n < 38; n ++) printf("chowla(%u) = %u\n", n, chowla(n));
unsigned n, count = 0, power = 100;
for (n = 2; n < 10000001; n ++) {
if (chowla(n) == 0) count ++;
if (n % power == 0) printf("There is %u primes < %u\n", count, power), power *= 10;
}
count = 0;
unsigned limit = 350000000;
unsigned k = 2, kk = 3, p;
for ( ; ; ) {
if ((p = k * kk) > limit) break;
if (chowla(p) == p - 1) {
printf("%d is a perfect number\n", p);
count ++;
}
k = kk + 1; kk += k;
}
printf("There are %u perfect numbers < %u\n", count, limit);
return 0;
}

View file

@ -0,0 +1,70 @@
% Chowla's function
chowla = proc (n: int) returns (int)
sum: int := 0
i: int := 2
while i*i <= n do
if n//i = 0 then
sum := sum + i
j: int := n/i
if i ~= j then
sum := sum + j
end
end
i := i + 1
end
return(sum)
end chowla
% A number is prime iff chowla(n) is 0
prime = proc (n: int) returns (bool)
return(chowla(n) = 0)
end prime
% A number is perfect iff chowla(n) equals n-1
perfect = proc (n: int) returns (bool)
return(chowla(n) = n-1)
end perfect
start_up = proc ()
LIMIT = 35000000
po: stream := stream$primary_output()
% Show chowla(1) through chowla(37)
for i: int in int$from_to(1, 37) do
stream$putl(po, "chowla(" || int$unparse(i) || ") = "
|| int$unparse(chowla(i)))
end
% Count primes up to powers of 10
pow10: int := 2 % start with 100
primecount: int := 1 % assume 2 is prime, then test only odd numbers
candidate: int := 3
while pow10 <= 7 do
if candidate >= 10**pow10 then
stream$putl(po, "There are "
|| int$unparse(primecount)
|| " primes up to "
|| int$unparse(10**pow10))
pow10 := pow10 + 1
end
if prime(candidate) then primecount := primecount + 1 end
candidate := candidate + 2
end
% Find perfect numbers up to 35 million
perfcount: int := 0
k: int := 2
kk: int := 3
while true do
n: int := k * kk
if n >= LIMIT then break end
if perfect(n) then
perfcount := perfcount + 1
stream$putl(po, int$unparse(n) || " is a perfect number.")
end
k := kk + 1
kk := kk + k
end
stream$putl(po, "There are " || int$unparse(perfcount) ||
" perfect numbers < 35,000,000.")
end start_up

View file

@ -0,0 +1,67 @@
include "cowgol.coh";
sub chowla(n: uint32): (sum: uint32) is
sum := 0;
var i: uint32 := 2;
while i*i <= n loop
if n % i == 0 then
sum := sum + i;
var j := n / i;
if i != j then
sum := sum + j;
end if;
end if;
i := i + 1;
end loop;
end sub;
var n: uint32 := 1;
while n <= 37 loop
print("chowla(");
print_i32(n);
print(") = ");
print_i32(chowla(n));
print("\n");
n := n + 1;
end loop;
n := 2;
var power: uint32 := 100;
var count: uint32 := 0;
while n <= 10000000 loop
if chowla(n) == 0 then
count := count + 1;
end if;
if n % power == 0 then
print("There are ");
print_i32(count);
print(" primes < ");
print_i32(power);
print_nl();
power := power * 10;
end if;
n := n + 1;
end loop;
count := 0;
const LIMIT := 35000000;
var k: uint32 := 2;
var kk: uint32 := 3;
loop
n := k * kk;
if n > LIMIT then break; end if;
if chowla(n) == n-1 then
print_i32(n);
print(" is a perfect number.\n");
count := count + 1;
end if;
k := kk + 1;
kk := kk + k;
end loop;
print("There are ");
print_i32(count);
print(" perfect numbers < ");
print_i32(LIMIT);
print_nl();

View file

@ -0,0 +1,63 @@
import std.stdio;
int chowla(int n) {
int sum;
for (int i = 2, j; i * i <= n; ++i) {
if (n % i == 0) {
sum += i + (i == (j = n / i) ? 0 : j);
}
}
return sum;
}
bool[] sieve(int limit) {
// True denotes composite, false denotes prime.
// Only interested in odd numbers >= 3
auto c = new bool[limit];
for (int i = 3; i * 3 < limit; i += 2) {
if (!c[i] && (chowla(i) == 0)) {
for (int j = 3 * i; j < limit; j += 2 * i) {
c[j] = true;
}
}
}
return c;
}
void main() {
foreach (i; 1..38) {
writefln("chowla(%d) = %d", i, chowla(i));
}
int count = 1;
int limit = cast(int)1e7;
int power = 100;
bool[] c = sieve(limit);
for (int i = 3; i < limit; i += 2) {
if (!c[i]) {
count++;
}
if (i == power - 1) {
writefln("Count of primes up to %10d = %d", power, count);
power *= 10;
}
}
count = 0;
limit = 350_000_000;
int k = 2;
int kk = 3;
int p;
for (int i = 2; ; ++i) {
p = k * kk;
if (p > limit) {
break;
}
if (chowla(p) == p - 1) {
writefln("%10d is a number that is perfect", p);
count++;
}
k = kk + 1;
kk += k;
}
writefln("There are %d perfect numbers <= 35,000,000", count);
}

View file

@ -0,0 +1,77 @@
func chowla(n) {
var sum = 0
var i = 2
var j = 0
while i * i <= n {
if n % i == 0 {
j = n / i
var app = if i == j {
0
} else {
j
}
sum += i + app
}
i += 1
}
return sum
}
func sieve(limit) {
var c = Array.Empty(limit)
var i = 3
while i * 3 < limit {
if !c[i] && (chowla(i) == 0) {
var j = 3 * i
while j < limit {
c[j] = true
j += 2 * i
}
}
i += 2
}
return c
}
for i in 1..37 {
print("chowla(\(i)) = \(chowla(i))")
}
var count = 1
var limit = 10000000
var power = 100
var c = sieve(limit)
var i = 3
while i < limit {
if !c[i] {
count += 1
}
if i == power - 1 {
print("Count of primes up to \(power) = \(count)")
power *= 10
}
i += 2
}
count = 0
limit = 35000000
var k = 2
var kk = 3
var p
i = 2
while true {
p = k * kk
if p > limit {
break
}
if chowla(p) == p - 1 {
print("\(p) is a number that is perfect")
count += 1
}
k = kk + 1
kk += k
}
print("There are \(count) perfect numbers <= 35,000,000")

View file

@ -0,0 +1,44 @@
fun chowla = int by int n
int sum = 0
int j = 0
for int i = 2; i * i <= n; i++ do
if n % i == 0 do sum += i + when(i == (j = n / i), 0, j) end
end
return sum
end
fun sieve = List by int limit
List c = logic[].with(limit)
for int i = 3; i * 3 < limit; i += 2
if c[i] or chowla(i) != 0 do continue end
for int j = 3 * i; j < limit; j += 2 * i do c[j] = true end
end
return c
end
# find and display (1 per line) for the 1st 37 integers
for int i = 1; i <= 37; i++ do writeLine("chowla(" + i + ") = " + chowla(i)) end
int count = 1
int limit = 10000000
int power = 100
List c = sieve(limit)
for int i = 3; i < limit; i += 2
if not c[i] do count++ end
if i == power - 1
writeLine("Count of primes up to " + power + " = " + count)
power *= 10
end
end
count = 0
limit = 35000000
int k = 2
int kk = 3
int p
for int i = 2; ; i++
if (p = k * kk) > limit do break end
if chowla(p) == p - 1
writeLine(p + " is a number that is perfect")
count++
end
k = kk + 1
kk += k
end
writeLine("There are " + count + " perfect numbers <= 35,000,000")

View file

@ -0,0 +1,90 @@
proc chowla n . sum .
sum = 0
i = 2
while i * i <= n
if n mod i = 0
j = n div i
if i = j
sum += i
else
sum += i + j
.
.
i += 1
.
.
proc sieve . c[] .
i = 3
while i * 3 <= len c[]
if c[i] = 0
call chowla i h
if h = 0
j = 3 * i
while j <= len c[]
c[j] = 1
j += 2 * i
.
.
.
i += 2
.
.
proc commatize n . s$ .
s$[] = strchars n
s$ = ""
l = len s$[]
for i = 1 to len s$[]
if i > 1 and l mod 3 = 0
s$ &= ","
.
l -= 1
s$ &= s$[i]
.
.
print "chowla number from 1 to 37"
for i = 1 to 37
call chowla i h
print " " & i & ": " & h
.
proc main . .
print ""
len c[] 10000000
count = 1
call sieve c[]
power = 100
i = 3
while i <= len c[]
if c[i] = 0
count += 1
.
if i = power - 1
call commatize power p$
call commatize count c$
print "There are " & c$ & " primes up to " & p$
power *= 10
.
i += 2
.
print ""
limit = 35000000
count = 0
i = 2
k = 2
kk = 3
repeat
p = k * kk
until p > limit
call chowla p h
if h = p - 1
call commatize p s$
print s$ & " is a perfect number"
count += 1
.
k = kk + 1
kk += k
i += 1
.
call commatize limit s$
print "There are " & count & " perfect mumbers up to " & s$
.
call main

View file

@ -0,0 +1,28 @@
USING: formatting fry grouping.extras io kernel math
math.primes.factors math.ranges math.statistics sequences
tools.memory.private ;
IN: rosetta-code.chowla-numbers
: chowla ( n -- m )
dup 1 = [ 1 - ] [ [ divisors sum ] [ - 1 - ] bi ] if ;
: show-chowla ( n -- )
[1,b] [ dup chowla "chowla(%02d) = %d\n" printf ] each ;
: count-primes ( seq -- )
dup 0 prefix [ [ 1 + ] dip 2 <range> ] 2clump-map
[ [ chowla zero? ] count ] map cum-sum
[ [ commas ] bi@ "Primes up to %s: %s\n" printf ] 2each ;
: show-perfect ( n -- )
[ 2 3 ] dip '[ 2dup * dup _ > ] [
dup [ chowla ] [ 1 - = ] bi
[ commas "%s is perfect\n" printf ] [ drop ] if
[ nip 1 + ] [ nip dupd + ] 2bi
] until 3drop ;
: chowla-demo ( -- )
37 show-chowla nl { 100 1000 10000 100000 1000000 10000000 }
count-primes nl 35e7 show-perfect ;
MAIN: chowla-demo

View file

@ -0,0 +1,82 @@
' Chowla_numbers
#include "string.bi"
Dim Shared As Long limite
limite = 10000000
Dim Shared As Boolean c(limite)
Dim As Long count, topenumprimo, a
count = 1
topenumprimo = 100
Dim As Longint p, k, kk, limitenumperfect
limitenumperfect = 35000000
k = 2: kk = 3
Declare Function chowla(Byval n As Longint) As Longint
Declare Sub sieve(Byval limite As Long, c() As Boolean)
Function chowla(Byval n As Longint) As Longint
Dim As Long i, j, r
i = 2
Do While i * i <= n
j = n \ i
If n Mod i = 0 Then
r += i
If i <> j Then r += j
End If
i += 1
Loop
chowla = r
End Function
Sub sieve(Byval limite As Long, c() As Boolean)
Dim As Long i, j
Redim As Boolean c(limite - 1)
i = 3
Do While i * 3 < limite
If Not c(i) Then
If chowla(i) = false Then
j = 3 * i
Do While j < limite
c(j) = true
j += 2 * i
Loop
End If
End If
i += 2
Loop
End Sub
Print "Chowla numbers"
For a = 1 To 37
Print "chowla(" & Trim(Str(a)) & ") = " & Trim(Str(chowla(a)))
Next a
' Si chowla(n) = falso and n > 1 Entonces n es primo
Print: Print "Contando los numeros primos hasta: "
sieve(limite, c())
For a = 3 To limite - 1 Step 2
If Not c(a) Then count += 1
If a = topenumprimo - 1 Then
Print Using "########## hay"; topenumprimo;
Print count
topenumprimo *= 10
End If
Next a
' Si chowla(n) = n - 1 and n > 1 Entonces n es un número perfecto
Print: Print "Buscando numeros perfectos... "
count = 0
Do
p = k * kk : If p > limitenumperfect Then Exit Do
If chowla(p) = p - 1 Then
Print Using "##########,# es un numero perfecto"; p
count += 1
End If
k = kk + 1 : kk += k
Loop
Print: Print "Hay " & count & " numeros perfectos <= " & Format(limitenumperfect, "###############################,#")
Print: Print "Pulsa una tecla para salir"
Sleep
End

View file

@ -0,0 +1,80 @@
package main
import "fmt"
func chowla(n int) int {
if n < 1 {
panic("argument must be a positive integer")
}
sum := 0
for i := 2; i*i <= n; i++ {
if n%i == 0 {
j := n / i
if i == j {
sum += i
} else {
sum += i + j
}
}
}
return sum
}
func sieve(limit int) []bool {
// True denotes composite, false denotes prime.
// Only interested in odd numbers >= 3
c := make([]bool, limit)
for i := 3; i*3 < limit; i += 2 {
if !c[i] && chowla(i) == 0 {
for j := 3 * i; j < limit; j += 2 * i {
c[j] = true
}
}
}
return c
}
func commatize(n int) string {
s := fmt.Sprintf("%d", n)
le := len(s)
for i := le - 3; i >= 1; i -= 3 {
s = s[0:i] + "," + s[i:]
}
return s
}
func main() {
for i := 1; i <= 37; i++ {
fmt.Printf("chowla(%2d) = %d\n", i, chowla(i))
}
fmt.Println()
count := 1
limit := int(1e7)
c := sieve(limit)
power := 100
for i := 3; i < limit; i += 2 {
if !c[i] {
count++
}
if i == power-1 {
fmt.Printf("Count of primes up to %-10s = %s\n", commatize(power), commatize(count))
power *= 10
}
}
fmt.Println()
count = 0
limit = 35000000
for i := uint(2); ; i++ {
p := 1 << (i - 1) * (1<<i - 1) // perfect numbers must be of this form
if p > limit {
break
}
if chowla(p) == p-1 {
fmt.Printf("%s is a perfect number\n", commatize(p))
count++
}
}
fmt.Println("There are", count, "perfect numbers <= 35,000,000")
}

View file

@ -0,0 +1,65 @@
class Chowla {
static int chowla(int n) {
if (n < 1) throw new RuntimeException("argument must be a positive integer")
int sum = 0
int i = 2
while (i * i <= n) {
if (n % i == 0) {
int j = (int) (n / i)
sum += (i == j) ? i : i + j
}
i++
}
return sum
}
static boolean[] sieve(int limit) {
// True denotes composite, false denotes prime.
// Only interested in odd numbers >= 3
boolean[] c = new boolean[limit]
for (int i = 3; i < limit / 3; i += 2) {
if (!c[i] && chowla(i) == 0) {
for (int j = 3 * i; j < limit; j += 2 * i) {
c[j] = true
}
}
}
return c
}
static void main(String[] args) {
for (int i = 1; i <= 37; i++) {
printf("chowla(%2d) = %d\n", i, chowla(i))
}
println()
int count = 1
int limit = 10_000_000
boolean[] c = sieve(limit)
int power = 100
for (int i = 3; i < limit; i += 2) {
if (!c[i]) {
count++
}
if (i == power - 1) {
printf("Count of primes up to %,10d = %,7d\n", power, count)
power *= 10
}
}
println()
count = 0
limit = 35_000_000
int i = 2
while (true) {
int p = (1 << (i - 1)) * ((1 << i) - 1) // perfect numbers must be of this form
if (p > limit) break
if (chowla(p) == p - 1) {
printf("%,d is a perfect number\n", p)
count++
}
i++
}
printf("There are %,d perfect numbers <= %,d\n", count, limit)
}
}

View file

@ -0,0 +1,63 @@
import Control.Concurrent (setNumCapabilities)
import Control.Monad.Par (runPar, get, spawnP)
import Control.Monad (join, (>=>))
import Data.List.Split (chunksOf)
import Data.List (intercalate, mapAccumL, genericTake, genericDrop)
import Data.Bifunctor (bimap)
import GHC.Conc (getNumProcessors)
import Math.NumberTheory.Primes (factorise, unPrime)
import Text.Printf (printf)
chowla :: Word -> Word
chowla 1 = 0
chowla n = f n
where
f = (-) =<< pred . product . fmap sumFactor . factorise
sumFactor (n, e) = foldr (\p s -> s + unPrime n^p) 1 [1..e]
chowlas :: [Word] -> [(Word, Word)]
chowlas [] = []
chowlas xs = runPar $ join <$>
(mapM (spawnP . fmap ((,) <*> chowla)) >=> mapM get) (chunksOf (10^6) xs)
chowlaPrimes :: [(Word, Word)] -> (Word, Word) -> (Word, Word)
chowlaPrimes chowlas range = (count chowlas, snd range)
where
isPrime (1, n) = False
isPrime (_, n) = n == 0
count = fromIntegral . length . filter isPrime . between range
between (min, max) = genericTake (max - pred min) . genericDrop (pred min)
chowlaPerfects :: [(Word, Word)] -> [Word]
chowlaPerfects = fmap fst . filter isPerfect
where
isPerfect (1, _) = False
isPerfect (n, c) = c == pred n
commas :: (Show a, Integral a) => a -> String
commas = reverse . intercalate "," . chunksOf 3 . reverse . show
main :: IO ()
main = do
cores <- getNumProcessors
setNumCapabilities cores
printf "Using %d cores\n" cores
mapM_ (uncurry (printf "chowla(%2d) = %d\n")) $ take 37 allChowlas
mapM_ (uncurry (printf "There are %8s primes < %10s\n"))
(chowlaP
[ (1, 10^2)
, (succ $ 10^2, 10^3)
, (succ $ 10^3, 10^4)
, (succ $ 10^4, 10^5)
, (succ $ 10^5, 10^6)
, (succ $ 10^6, 10^7) ])
mapM_ (printf "%10s is a perfect number.\n" . commas) perfects
printf "There are %2d perfect numbers < 35,000,000\n" $ length perfects
where
chowlaP = fmap (bimap commas commas) . snd
. mapAccumL (\total (count, max) -> (total + count, (total + count, max))) 0
. fmap (chowlaPrimes $ take (10^7) allChowlas)
perfects = chowlaPerfects allChowlas
allChowlas = chowlas [1..35*10^6]

View file

@ -0,0 +1,5 @@
chowla=: >: -~ >:@#.~/.~&.q: NB. sum of factors - (n + 1)
intsbelow=: (2 }. i.)"0
countPrimesbelow=: +/@(0 = chowla)@intsbelow
findPerfectsbelow=: (#~ <: = chowla)@intsbelow

View file

@ -0,0 +1,42 @@
(] ,. chowla) >: i. 37 NB. chowla numbers 1-37
1 0
2 0
3 0
4 2
5 0
6 5
7 0
8 6
9 3
10 7
11 0
12 15
13 0
14 9
15 8
16 14
17 0
18 20
19 0
20 21
21 10
22 13
23 0
24 35
25 5
26 15
27 12
28 27
29 0
30 41
31 0
32 30
33 14
34 19
35 12
36 54
37 0
countPrimesbelow 100 1000 10000 100000 1000000 10000000
25 168 1229 9592 78498 664579
findPerfectsbelow 35000000
6 28 496 8128 33550336

View file

@ -0,0 +1,85 @@
public class Chowla {
public static void main(String[] args) {
int[] chowlaNumbers = findChowlaNumbers(37);
for (int i = 0; i < chowlaNumbers.length; i++) {
System.out.printf("chowla(%d) = %d%n", (i+1), chowlaNumbers[i]);
}
System.out.println();
int[][] primes = countPrimes(100, 10_000_000);
for (int i = 0; i < primes.length; i++) {
System.out.printf(Locale.US, "There is %,d primes up to %,d%n", primes[i][1], primes[i][0]);
}
System.out.println();
int[] perfectNumbers = findPerfectNumbers(35_000_000);
for (int i = 0; i < perfectNumbers.length; i++) {
System.out.printf("%d is a perfect number%n", perfectNumbers[i]);
}
System.out.printf(Locale.US, "There are %d perfect numbers < %,d%n", perfectNumbers.length, 35_000_000);
}
public static int chowla(int n) {
if (n < 0) throw new IllegalArgumentException("n is not positive");
int sum = 0;
for (int i = 2, j; i * i <= n; i++)
if (n % i == 0) sum += i + (i == (j = n / i) ? 0 : j);
return sum;
}
protected static int[][] countPrimes(int power, int limit) {
int count = 0;
int[][] num = new int[countMultiplicity(limit, power)][2];
for (int n = 2, i=0; n <= limit; n++) {
if (chowla(n) == 0) count++;
if (n % power == 0) {
num[i][0] = power;
num[i][1] = count;
i++;
power *= 10;
}
}
return num;
}
protected static int countMultiplicity(int limit, int start) {
int count = 0;
int cur = limit;
while(cur >= start) {
count++;
cur = cur/10;
}
return count;
}
protected static int[] findChowlaNumbers(int limit) {
int[] num = new int[limit];
for (int i = 0; i < limit; i++) {
num[i] = chowla(i+1);
}
return num;
}
protected static int[] findPerfectNumbers(int limit) {
int count = 0;
int[] num = new int[count];
int k = 2, kk = 3, p;
while ((p = k * kk) < limit) {
if (chowla(p) == p - 1) {
num = increaseArr(num);
num[count++] = p;
}
k = kk + 1;
kk += k;
}
return num;
}
private static int[] increaseArr(int[] arr) {
int[] tmp = new int[arr.length + 1];
System.arraycopy(arr, 0, tmp, 0, arr.length);
return tmp;
}
}

View file

@ -0,0 +1,73 @@
def add(stream): reduce stream as $x (0; . + $x);
# input should be an integer
def commatize:
def digits: tostring | explode | reverse;
if . == null then ""
elif . < 0 then "-" + ((- .) | commatize)
else [foreach digits[] as $d (-1; .+1;
# "," is 44
(select(. > 0 and . % 3 == 0)|44), $d)]
| reverse
| implode
end;
def count(stream): reduce stream as $i (0; . + 1);
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .;
# To take advantage of gojq's arbitrary-precision integer arithmetic:
def power($b): . as $in | reduce range(0;$b) as $i (1; . * $in);
# unordered
def proper_divisors:
. as $n
| if $n > 1 then 1,
( range(2; 1 + (sqrt|floor)) as $i
| if ($n % $i) == 0 then $i,
(($n / $i) | if . == $i then empty else . end)
else empty
end)
else empty
end;
def chowla:
if . == 1 then 0
else add(proper_divisors) - 1
end;
# Input: a positive integer
def is_chowla_prime:
. > 1 and chowla == 0;
# In the interests of green(er) computing ...
def chowla_primes($n):
2, range(3; $n; 2) | select(is_chowla_prime);
def report_chowla_primes:
reduce range(2; 10000000) as $i (null;
if $i | is_chowla_prime
then if $i < 10000000 then .[7] += 1 else . end
| if $i < 1000000 then .[6] += 1 else . end
| if $i < 100000 then .[5] += 1 else . end
| if $i < 10000 then .[4] += 1 else . end
| if $i < 1000 then .[3] += 1 else . end
| if $i < 100 then .[2] += 1 else . end
else . end)
| (range(2;8) as $i
| "10 ^ \($i) \(.[$i]|commatize|lpad(16))") ;
def is_chowla_perfect:
(. > 1) and (chowla == . - 1);
def task:
" n\("chowla"|lpad(16))",
(range(1;38) | "\(lpad(3)): \(chowla|lpad(10))"),
"\n n \("Primes < n"|lpad(10))",
report_chowla_primes,
# "\nPerfect numbers up to 35e6",
# (range(1; 35e6) | select(is_chowla_perfect) | commatize)
""
;
task

View file

@ -0,0 +1,40 @@
using Primes, Formatting
function chowla(n)
if n < 1
throw("Chowla function argument must be positive")
elseif n < 4
return zero(n)
else
f = [one(n)]
for (p,e) in factor(n)
f = reduce(vcat, [f*p^j for j in 1:e], init=f)
end
return sum(f) - one(n) - n
end
end
function countchowlas(n, asperfect=false, verbose=false)
count = 0
for i in 2:n # 1 is not prime or perfect so skip
chow = chowla(i)
if (asperfect && chow == i - 1) || (!asperfect && chow == 0)
count += 1
verbose && println("The number $(format(i, commas=true)) is ", asperfect ? "perfect." : "prime.")
end
end
count
end
function testchowla()
println("The first 37 chowla numbers are:")
for i in 1:37
println("Chowla($i) is ", chowla(i))
end
for i in [100, 1000, 10000, 100000, 1000000, 10000000]
println("The count of the primes up to $(format(i, commas=true)) is $(format(countchowlas(i), commas=true))")
end
println("The count of perfect numbers up to 35,000,000 is $(countchowlas(35000000, true, true)).")
end
testchowla()

View file

@ -0,0 +1,61 @@
// Version 1.3.21
fun chowla(n: Int): Int {
if (n < 1) throw RuntimeException("argument must be a positive integer")
var sum = 0
var i = 2
while (i * i <= n) {
if (n % i == 0) {
val j = n / i
sum += if (i == j) i else i + j
}
i++
}
return sum
}
fun sieve(limit: Int): BooleanArray {
// True denotes composite, false denotes prime.
// Only interested in odd numbers >= 3
val c = BooleanArray(limit)
for (i in 3 until limit / 3 step 2) {
if (!c[i] && chowla(i) == 0) {
for (j in 3 * i until limit step 2 * i) c[j] = true
}
}
return c
}
fun main() {
for (i in 1..37) {
System.out.printf("chowla(%2d) = %d\n", i, chowla(i))
}
println()
var count = 1
var limit = 10_000_000
val c = sieve(limit)
var power = 100
for (i in 3 until limit step 2) {
if (!c[i]) count++
if (i == power - 1) {
System.out.printf("Count of primes up to %,-10d = %,d\n", power, count)
power *= 10
}
}
println()
count = 0
limit = 35_000_000
var i = 2
while (true) {
val p = (1 shl (i - 1)) * ((1 shl i) - 1) // perfect numbers must be of this form
if (p > limit) break
if (chowla(p) == p - 1) {
System.out.printf("%,d is a perfect number\n", p)
count++
}
i++
}
println("There are $count perfect numbers <= 35,000,000")
}

View file

@ -0,0 +1,78 @@
function chowla(n)
local sum = 0
local i = 2
local j = 0
while i * i <= n do
if n % i == 0 then
j = math.floor(n / i)
sum = sum + i
if i ~= j then
sum = sum + j
end
end
i = i + 1
end
return sum
end
function sieve(limit)
-- True denotes composite, false denotes prime.
-- Only interested in odd numbers >= 3
local c = {}
local i = 3
while i * 3 < limit do
if not c[i] and (chowla(i) == 0) then
local j = 3 * i
while j < limit do
c[j] = true
j = j + 2 * i
end
end
i = i + 2
end
return c
end
function main()
for i = 1, 37 do
print(string.format("chowla(%d) = %d", i, chowla(i)))
end
local count = 1
local limit = math.floor(1e7)
local power = 100
local c = sieve(limit)
local i = 3
while i < limit do
if not c[i] then
count = count + 1
end
if i == power - 1 then
print(string.format("Count of primes up to %10d = %d", power, count))
power = power * 10
end
i = i + 2
end
count = 0
limit = 350000000
local k = 2
local kk = 3
local p = 0
i = 2
while true do
p = k * kk
if p > limit then
break
end
if chowla(p) == p - 1 then
print(string.format("%10d is a number that is perfect", p))
count = count + 1
end
k = kk + 1
kk = kk + k
i = i + 1
end
print(string.format("There are %d perfect numbers <= 35,000,000", count))
end
main()

View file

@ -0,0 +1,51 @@
NORMAL MODE IS INTEGER
INTERNAL FUNCTION(N)
ENTRY TO CHOWLA.
SUM = 0
THROUGH LOOP, FOR I=2, 1, I*I.G.N
J = N/I
WHENEVER J*I.E.N
SUM = SUM + I
WHENEVER I.NE.J, SUM = SUM + J
END OF CONDITIONAL
LOOP CONTINUE
FUNCTION RETURN SUM
END OF FUNCTION
VECTOR VALUES CHWFMT = $7HCHOWLA(,I2,4H) = ,I2*$
THROUGH CH37, FOR CH=1, 1, CH.G.37
CH37 PRINT FORMAT CHWFMT, CH, CHOWLA.(CH)
VECTOR VALUES PRIMES =
0 $10HTHERE ARE ,I6,S1,13HPRIMES BELOW ,I8*$
POWER = 100
COUNT = 0
THROUGH PRM, FOR CH=2, 1, CH.G.10000000
WHENEVER CHOWLA.(CH).E.0, COUNT = COUNT + 1
WHENEVER (CH/POWER)*POWER.E.CH
PRINT FORMAT PRIMES, COUNT, POWER
POWER = POWER * 10
PRM END OF CONDITIONAL
COUNT = 0
LIMIT = 35000000
VECTOR VALUES PERFCT = $I8,S1,20HIS A PERFECT NUMBER.*$
VECTOR VALUES PRFCNT =
0 $10HTHERE ARE ,I1,S1,22HPERFECT NUMBERS BELOW ,I8*$
K = 2
KK = 3
LOOP CH = K * KK
WHENEVER CH.G.LIMIT, TRANSFER TO DONE
WHENEVER CHOWLA.(CH).E.CH-1
PRINT FORMAT PERFCT, CH
COUNT = COUNT + 1
END OF CONDITIONAL
K = KK + 1
KK = KK + K
TRANSFER TO LOOP
DONE PRINT FORMAT PRFCNT, COUNT, LIMIT
END OF PROGRAM

View file

@ -0,0 +1,29 @@
ChowlaFunction := n -> NumberTheory:-SumOfDivisors(n) - n - 1;
PrintChowla := proc(n::posint) local i;
printf("Integer : Chowla Number\n");
for i to n do
printf("%d : %d\n", i, ChowlaFunction(i));
end do;
end proc:
countPrimes := n -> nops([ListTools[SearchAll](0, map(ChowlaFunction, [seq(1 .. n)]))]);
findPerfect := proc(n::posint) local to_check, found, k;
to_check := map(ChowlaFunction, [seq(1 .. n)]);
found := [];
for k to n do
if to_check(k) = k - 1 then
found := [found, k];
end if;
end do;
end proc:
PrintChowla(37);
countPrimes(100);
countPrimes(1000);
countPrimes(10000);
countPrimes(100000);
countPrimes(1000000);
countPrimes(10000000);
findPerfect(35000000)

View file

@ -0,0 +1,12 @@
ClearAll[Chowla]
Chowla[0 | 1] := 0
Chowla[n_] := DivisorSigma[1, n] - 1 - n
Table[{i, Chowla[i]}, {i, 37}] // Grid
PrintTemporary[Dynamic[n]];
i = 1; Do[If[Chowla[n] == 0, i++], {n, 3, 100, 2}]; i
i = 1; Do[If[Chowla[n] == 0, i++], {n, 3, 1000, 2}]; i
i = 1; Do[If[Chowla[n] == 0, i++], {n, 3, 10000, 2}]; i
i = 1; Do[If[Chowla[n] == 0, i++], {n, 3, 100000, 2}]; i
i = 1; Do[If[Chowla[n] == 0, i++], {n, 3, 1000000, 2}]; i
i = 1; Do[If[Chowla[n] == 0, i++], {n, 3, 10000000, 2}]; i
Reap[Do[If[Chowla[n] == n - 1, Sow[n]], {n, 1, 35 10^6}]][[2, 1]]

View file

@ -0,0 +1,43 @@
import strformat
import strutils
func chowla(n: uint64): uint64 =
var sum = 0u64
var i = 2u64
var j: uint64
while i * i <= n:
if n mod i == 0:
j = n div i
sum += i
if i != j:
sum += j
inc i
sum
for n in 1u64..37:
echo &"chowla({n}) = {chowla(n)}"
var count = 0
var power = 100u64
for n in 2u64..10_000_000:
if chowla(n) == 0:
inc count
if n mod power == 0:
echo &"There are {insertSep($count, ','):>7} primes < {insertSep($power, ','):>10}"
power *= 10
count = 0
const limit = 350_000_000u64
var k = 2u64
var kk = 3u64
var p: uint64
while true:
p = k * kk
if p > limit:
break
if chowla(p) == p - 1:
echo &"{insertSep($p, ','):>10} is a perfect number"
inc count
k = kk + 1
kk += k
echo &"There are {count} perfect numbers < {insertSep($limit, ',')}"

View file

@ -0,0 +1,106 @@
program Chowla_numbers;
{$IFDEF FPC}
{$MODE Delphi}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
SysUtils
{$IFDEF FPC}
,StrUtils{for Numb2USA}
{$ENDIF}
;
{$IFNDEF FPC}
function Numb2USA(const S: string): string;
var
I, NA: Integer;
begin
I := Length(S);
Result := S;
NA := 0;
while (I > 0) do
begin
if ((Length(Result) - I + 1 - NA) mod 3 = 0) and (I <> 1) then
begin
Insert(',', Result, I);
Inc(NA);
end;
Dec(I);
end;
end;
{$ENDIF}
function Chowla(n: NativeUint): NativeUint;
var
Divisor, Quotient: NativeUint;
begin
result := 0;
Divisor := 2;
while sqr(Divisor) < n do
begin
Quotient := n div Divisor;
if Quotient * Divisor = n then
inc(result, Divisor + Quotient);
inc(Divisor);
end;
if sqr(Divisor) = n then
inc(result, Divisor);
end;
procedure Count10Primes(Limit: NativeUInt);
var
n, i, cnt: integer;
begin
writeln;
writeln(' primes til | count');
i := 100;
n := 2;
cnt := 0;
repeat
repeat
// Ord (true) = 1 ,Ord (false) = 0
inc(cnt, ORD(chowla(n) = 0));
inc(n);
until n > i;
writeln(Numb2USA(IntToStr(i)): 12, '|', Numb2USA(IntToStr(cnt)): 10);
i := i * 10;
until i > Limit;
end;
procedure CheckPerf;
var
k, kk, p, cnt, limit: NativeInt;
begin
writeln;
writeln(' number that is perfect');
cnt := 0;
limit := 35000000;
k := 2;
kk := 3;
repeat
p := k * kk;
if p > limit then
BREAK;
if chowla(p) = (p - 1) then
begin
writeln(Numb2USA(IntToStr(p)): 12);
inc(cnt);
end;
k := kk + 1;
inc(kk, k);
until false;
end;
var
I: integer;
begin
for I := 2 to 37 do
writeln('chowla(', I: 2, ') =', chowla(I): 3);
Count10Primes(10 * 1000 * 1000);
CheckPerf;
end.

View file

@ -0,0 +1,36 @@
use strict;
use warnings;
use ntheory 'divisor_sum';
sub comma { reverse ((reverse shift) =~ s/(.{3})/$1,/gr) =~ s/^,//r }
sub chowla {
my($n) = @_;
$n < 2 ? 0 : divisor_sum($n) - ($n + 1);
}
sub prime_cnt {
my($n) = @_;
my $cnt = 1;
for (3..$n) {
$cnt++ if $_%2 and chowla($_) == 0
}
$cnt;
}
sub perfect {
my($n) = @_;
my @p;
for my $i (1..$n) {
push @p, $i if $i > 1 and chowla($i) == $i-1;
}
# map { push @p, $_ if $_ > 1 and chowla($_) == $_-1 } 1..$n; # speed penalty
@p;
}
printf "chowla(%2d) = %2d\n", $_, chowla($_) for 1..37;
print "\nCount of primes up to:\n";
printf "%10s %s\n", comma(10**$_), comma(prime_cnt(10**$_)) for 2..7;
my @perfect = perfect(my $limit = 35_000_000);
printf "\nThere are %d perfect numbers up to %s: %s\n",
1+$#perfect, comma($limit), join(' ', map { comma($_) } @perfect);

View file

@ -0,0 +1,51 @@
(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">chowla</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">factors</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;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">sieve</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">limit</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- True denotes composite, false denotes prime.
-- Only interested in odd numbers &gt;= 3</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #004600;">false</span><span style="color: #0000FF;">,</span><span style="color: #000000;">limit</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;">3</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</span><span style="color: #0000FF;">/</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">by</span> <span style="color: #000000;">2</span> <span style="color: #008080;">do</span>
<span style="color: #000080;font-style:italic;">-- if not c[i] and chowla(i)==0 then</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- (see note below)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">3</span><span style="color: #0000FF;">*</span><span style="color: #000000;">i</span> <span style="color: #008080;">to</span> <span style="color: #000000;">limit</span> <span style="color: #008080;">by</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">i</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">c</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</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: #000000;">c</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">limit</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1e7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">count</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pow10</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">100</span><span style="color: #0000FF;">,</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: #004080;">sequence</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</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: #000000;">37</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">chowla</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</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;">"chowla[1..37]: %V\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sieve</span><span style="color: #0000FF;">(</span><span style="color: #000000;">limit</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;">3</span> <span style="color: #008080;">to</span> <span style="color: #000000;">limit</span> <span style="color: #008080;">by</span> <span style="color: #000000;">2</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> <span style="color: #000000;">count</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">==</span><span style="color: #000000;">pow10</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</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;">"Count of primes up to %,d = %,d\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">pow10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">count</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">pow10</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">10</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: #000000;">count</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #000000;">limit</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">machine_bits</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">32</span><span style="color: #0000FF;">?</span><span style="color: #000000;">1.4e11</span><span style="color: #0000FF;">:</span><span style="color: #000000;">2.4e18</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">--limit = power(2,iff(machine_bits()=32?53:64)) -- (see note below)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">p</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</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: #0000FF;">)*(</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</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: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- perfect numbers must be of this form</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">></span><span style="color: #000000;">limit</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">chowla</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)==</span><span style="color: #000000;">p</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</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;">"%,d is a perfect number\n"</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">count</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</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;">"There are %d perfect numbers &lt;= %,d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">count</span><span style="color: #0000FF;">,</span><span style="color: #000000;">limit</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>
<!--

View file

@ -0,0 +1,39 @@
table
chowla(1) = 0.
chowla(2) = 0.
chowla(3) = 0.
chowla(N) = C, N>3 =>
Max = floor(sqrt(N)),
Sum = 0,
foreach (X in 2..Max, N mod X == 0)
Y := N div X,
Sum := Sum + X + Y
end,
if (N == Max * Max) then
Sum := Sum - Max
end,
C = Sum.
main =>
foreach (I in 1..37)
printf("chowla(%d) = %d\n", I, chowla(I))
end,
Ranges = {100, 1000, 10000, 100000, 1000000, 10000000},
foreach (Range in Ranges)
Count = 0,
foreach (I in 2..Range)
if (chowla(I) == 0) then
Count := Count + 1
end
end,
printf("There are %d primes less than %d.\n", Count, Range)
end,
Limit = 35000000,
Count = 0,
foreach (I in 2..Limit)
if (chowla(I) == I-1) then
printf("%d is a perfect number\n", I),
Count := Count + 1
end
end,
printf("There are %d perfect numbers less than %d.\n", Count, Limit).

View file

@ -0,0 +1,64 @@
(de accu1 (Var Key)
(if (assoc Key (val Var))
(con @ (inc (cdr @)))
(push Var (cons Key 1)) )
Key )
(de factor (N)
(let
(R NIL
D 2
L (1 2 2 . (4 2 4 2 4 6 2 6 .))
M (sqrt N) )
(while (>= M D)
(if (=0 (% N D))
(setq M
(sqrt (setq N (/ N (accu1 'R D)))) )
(inc 'D (pop 'L)) ) )
(accu1 'R N)
(mapcar
'((L)
(make
(for N (cdr L)
(link (** (car L) N)) ) ) )
R ) ) )
(de chowla (N)
(let F (factor N)
(-
(sum
prog
(make
(link 1)
(mapc
'((A)
(chain
(mapcan
'((B)
(mapcar '((C) (* C B)) (made)) )
A ) ) )
F ) ) )
N
1 ) ) )
(de prime (N)
(and (> N 1) (=0 (chowla N))) )
(de perfect (N)
(and
(> N 1)
(= (chowla N) (dec N))) )
(de countP (N)
(let C 0
(for I N
(and (prime I) (inc 'C)) )
C ) )
(de listP (N)
(make
(for I N
(and (perfect I) (link I)) ) ) )
(for I 37
(prinl "chowla(" I ") = " (chowla I)) )
(prinl "Count of primes up to 100 = " (countP 100))
(prinl "Count of primes up to 1000 = " (countP 1000))
(prinl "Count of primes up to 10000 = " (countP 10000))
(prinl "Count of primes up to 100000 = " (countP 100000))
(prinl "Count of primes up to 1000000 = " (countP 1000000))
(prinl "Count of primes up to 10000000 = " (countP 10000000))
(println (listP 35000000))

View file

@ -0,0 +1,98 @@
#COMPILE EXE
#DIM ALL
#COMPILER PBCC 6
FUNCTION chowla(BYVAL n AS LONG) AS LONG
REGISTER i AS LONG, j AS LONG
LOCAL r AS LONG
i = 2
DO WHILE i * i <= n
j = n \ i
IF n MOD i = 0 THEN
r += i
IF i <> j THEN
r += j
END IF
END IF
INCR i
LOOP
FUNCTION = r
END FUNCTION
FUNCTION chowla1(BYVAL n AS QUAD) AS QUAD
LOCAL i, j, r AS QUAD
i = 2
DO WHILE i * i <= n
j = n \ i
IF n MOD i = 0 THEN
r += i
IF i <> j THEN
r += j
END IF
END IF
INCR i
LOOP
FUNCTION = r
END FUNCTION
SUB sieve(BYVAL limit AS LONG, BYREF c() AS INTEGER)
LOCAL i, j AS LONG
REDIM c(limit - 1)
i = 3
DO WHILE i * 3 < limit
IF NOT c(i) THEN
IF chowla(i) = 0 THEN
j = 3 * i
DO WHILE j < limit
c(j) = -1
j += 2 * i
LOOP
END IF
END IF
i += 2
LOOP
END SUB
FUNCTION PBMAIN () AS LONG
LOCAL i, count, limit, power AS LONG
LOCAL c() AS INTEGER
LOCAL s AS STRING
LOCAL s30 AS STRING * 30
LOCAL p, k, kk, r, ql AS QUAD
FOR i = 1 TO 37
s = "chowla(" & TRIM$(STR$(i)) & ") = " & TRIM$(STR$(chowla(i)))
CON.PRINT s
NEXT i
count = 1
limit = 10000000
power = 100
CALL sieve(limit, c())
FOR i = 3 TO limit - 1 STEP 2
IF ISFALSE c(i) THEN count += 1
IF i = power - 1 THEN
RSET s30 = FORMAT$(power, "#,##0")
s = "Count of primes up to " & s30 & " =" & STR$(count)
CON.PRINT s
power *= 10
END IF
NEXT i
ql = 2 ^ 61
k = 2: kk = 3
RESET count
DO
p = k * kk : IF p > ql THEN EXIT DO
IF chowla1(p) = p - 1 THEN
RSET s30 = FORMAT$(p, "#,##0")
s = s30 & " is a number that is perfect"
CON.PRINT s
count += 1
END IF
k = kk + 1 : kk += k
LOOP
s = "There are" & STR$(count) & " perfect numbers <= " & FORMAT$(ql, "#,##0")
CON.PRINT s
CON.PRINT "press any key to exit program"
CON.WAITKEY$
END FUNCTION

View file

@ -0,0 +1,64 @@
chowla(1, 0).
chowla(2, 0).
chowla(N, C) :-
N > 2,
Max is floor(sqrt(N)),
findall(X, (between(2, Max, X), N mod X =:= 0), Xs),
findall(Y, (member(X1, Xs), Y is N div X1, Y \= Max), Ys),
!,
sum_list(Xs, S1),
sum_list(Ys, S2),
C is S1 + S2.
prime_count(Upper, Upper, Count, Count) :-
!.
prime_count(Lower, Upper, Add, Count) :-
chowla(Lower, 0),
!,
Lower1 is Lower + 1,
Add1 is Add + 1,
prime_count(Lower1, Upper, Add1, Count).
prime_count(Lower, Upper, Add, Count) :-
Lower1 is Lower + 1,
prime_count(Lower1, Upper, Add, Count).
perfect_numbers(Upper, Upper, AccNums, Nums) :-
!,
reverse(AccNums, Nums).
perfect_numbers(Lower, Upper, AccNums, Nums) :-
Perfect is Lower - 1,
chowla(Lower, Perfect),
!,
Lower1 is Lower + 1,
AccNums1 = [Lower|AccNums],
perfect_numbers(Lower1, Upper, AccNums1, Nums).
perfect_numbers(Lower, Upper, AccNums, Nums) :-
Lower1 is Lower + 1,
perfect_numbers(Lower1, Upper, AccNums, Nums).
main :-
% Chowla numbers
forall(between(1, 37, N), (
chowla(N, C),
format('chowla(~D) = ~D\n', [N, C])
)),
% Prime numbers
Ranges = [100, 1000, 10000, 100000, 1000000, 10000000],
forall(member(Range, Ranges), (
prime_count(2, Range, 0, PrimeCount),
format('There are ~D primes less than ~D.\n', [PrimeCount, Range])
)),
% Perfect numbers
Limit = 35000000,
perfect_numbers(2, Limit, [], Nums),
forall(member(Perfect, Nums), (
format('~D is a perfect number.\n', [Perfect])
)),
length(Nums, PerfectCount),
format('There are ~D perfect numbers < ~D.\n', [PerfectCount, Limit]).

View file

@ -0,0 +1,32 @@
# https://docs.sympy.org/latest/modules/ntheory.html#sympy.ntheory.factor_.divisors
from sympy import divisors
def chowla(n):
return 0 if n < 2 else sum(divisors(n, generator=True)) - 1 -n
def is_prime(n):
return chowla(n) == 0
def primes_to(n):
return sum(chowla(i) == 0 for i in range(2, n))
def perfect_between(n, m):
c = 0
print(f"\nPerfect numbers between [{n:_}, {m:_})")
for i in range(n, m):
if i > 1 and chowla(i) == i - 1:
print(f" {i:_}")
c += 1
print(f"Found {c} Perfect numbers between [{n:_}, {m:_})")
if __name__ == '__main__':
for i in range(1, 38):
print(f"chowla({i:2}) == {chowla(i)}")
for i in range(2, 6):
print(f"primes_to({10**i:_}) == {primes_to(10**i):_}")
perfect_between(1, 1_000_000)
print()
for i in range(6, 8):
print(f"primes_to({10**i:_}) == {primes_to(10**i):_}")
perfect_between(1_000_000, 35_000_000)

View file

@ -0,0 +1,34 @@
from numba import jit
# https://docs.sympy.org/latest/modules/ntheory.html#sympy.ntheory.factor_.divisors
from sympy import divisors
@jit
def chowla(n):
return 0 if n < 2 else sum(divisors(n, generator=True)) - 1 -n
@jit
def is_prime(n):
return chowla(n) == 0
@jit
def primes_to(n):
acc = 0
for i in range(2, n):
if chowla(i) == 0:
acc += 1
return acc
@jit
def _perfect_between(n, m):
for i in range(n, m):
if i > 1 and chowla(i) == i - 1:
yield i
def perfect_between(n, m):
c = 0
print(f"\nPerfect numbers between [{n:_}, {m:_})")
for i in _perfect_between(n, m):
print(f" {i:_}")
c += 1
print(f"Found {c} Perfect numbers between [{n:_}, {m:_})")

View file

@ -0,0 +1,29 @@
/*REXX program computes/displays chowla numbers (and may count primes & perfect numbers.*/
parse arg LO HI . /*obtain optional arguments from the CL*/
if LO=='' | LO=="," then LO= 1 /*Not specified? Then use the default.*/
perf= LO<0; LO= abs(LO) /*Negative? Then determine if perfect.*/
if HI=='' | HI=="," then HI= LO /*Not specified? Then use the default.*/
prim= HI<0; HI= abs(HI) /*Negative? Then determine if a prime.*/
numeric digits max(9, length(HI) + 1 ) /*use enough decimal digits for // */
w= length( commas(HI) ) /*W: used in aligning output numbers.*/
tell= \(prim | perf) /*set boolean value for showing chowlas*/
p= 0 /*the number of primes found (so far).*/
do j=LO to HI; #= chowla(j) /*compute the cholwa number for J. */
if tell then say right('chowla('commas(j)")", w+9) ' = ' right( commas(#), w)
else if #==0 then if j>1 then p= p+1
if perf then if j-1==# & j>1 then say right(commas(j), w) ' is a perfect number.'
end /*j*/
if prim & \perf then say 'number of primes found for the range ' commas(LO) " to " ,
commas(HI) " (inclusive) is: " commas(p)
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
chowla: procedure; parse arg x; if x<2 then return 0; odd= x // 2
s=0 /* [↓] use EVEN or ODD integers. ___*/
do k=2+odd by 1+odd while k*k<x /*divide by all the integers up to √ X */
if x//k==0 then s=s + k + x%k /*add the two divisors to the sum. */
end /*k*/ /* [↓] adkust for square. ___*/
if k*k==x then s=s + k /*Was X a square? If so, add √ X */
return s /*return " " " " " */
/*──────────────────────────────────────────────────────────────────────────────────────*/
commas: parse arg _; do k=length(_)-3 to 1 by -3; _= insert(',', _, k); end; return _

View file

@ -0,0 +1,45 @@
#lang racket
(require racket/fixnum)
(define cache-size 35000000)
(define chowla-cache (make-fxvector cache-size -1))
(define (chowla/uncached n)
(for/sum ((i (sequence-filter (λ (x) (zero? (modulo n x))) (in-range 2 (add1 (quotient n 2)))))) i))
(define (chowla n)
(if (> n cache-size)
(chowla/uncached n)
(let ((idx (sub1 n)))
(if (negative? (fxvector-ref chowla-cache idx))
(let ((c (chowla/uncached n))) (fxvector-set! chowla-cache idx c) c)
(fxvector-ref chowla-cache idx)))))
(define (prime?/chowla n)
(and (> n 1)
(zero? (chowla n))))
(define (perfect?/chowla n)
(and (> n 1)
(= n (add1 (chowla n)))))
(define (make-chowla-sieve n)
(let ((v (make-vector n 0)))
(for* ((i (in-range 2 n)) (j (in-range (* 2 i) n i))) (vector-set! v j (+ i (vector-ref v j))))
(for ((i (in-range 1 n))) (fxvector-set! chowla-cache (sub1 i) (vector-ref v i)))))
(module+
main
(define (count-and-report-primes limit)
(printf "Primes < ~a: ~a~%" limit (for/sum ((i (sequence-filter prime?/chowla (in-range 2 (add1 limit))))) 1)))
(for ((i (in-range 1 (add1 37)))) (printf "(chowla ~a) = ~a~%" i (chowla i)))
(make-chowla-sieve cache-size)
(for-each count-and-report-primes '(1000 10000 100000 1000000 10000000))
(let ((ns (for/list ((n (sequence-filter perfect?/chowla (in-range 2 35000000)))) n)))
(printf "There are ~a perfect numbers <= 35000000: ~a~%" (length ns) ns)))

View file

@ -0,0 +1,28 @@
sub comma { $^i.flip.comb(3).join(',').flip }
sub schnitzel (\Radda, \radDA = 0) {
Radda.is-prime ?? !Radda !! ?radDA ?? Radda
!! sum flat (2 .. Radda.sqrt.floor).map: -> \RAdda {
my \RADDA = Radda div RAdda;
next if RADDA * RAdda !== Radda;
RAdda !== RADDA ?? (RAdda, RADDA) !! RADDA
}
}
my \chowder = cache (1..Inf).hyper(:8degree).grep( !*.&schnitzel: 'panini' );
my \mung-daal = lazy gather for chowder -> \panini {
my \gazpacho = 2**panini - 1;
take gazpacho * 2**(panini - 1) unless schnitzel gazpacho, panini;
}
printf "chowla(%2d) = %2d\n", $_, .&schnitzel for 1..37;
say '';
printf "Count of primes up to %10s: %s\n", comma(10**$_),
comma chowder.first( * > 10**$_, :k) for 2..7;
say "\nPerfect numbers less than 35,000,000";
.&comma.say for mung-daal[^5];

View file

@ -0,0 +1,53 @@
def chowla(n)
sum = 0
i = 2
while i * i <= n do
if n % i == 0 then
sum = sum + i
j = n / i
if i != j then
sum = sum + j
end
end
i = i + 1
end
return sum
end
def main
for n in 1 .. 37 do
puts "chowla(%d) = %d" % [n, chowla(n)]
end
count = 0
power = 100
for n in 2 .. 10000000 do
if chowla(n) == 0 then
count = count + 1
end
if n % power == 0 then
puts "There are %d primes < %d" % [count, power]
power = power * 10
end
end
count = 0
limit = 350000000
k = 2
kk = 3
loop do
p = k * kk
if p > limit then
break
end
if chowla(p) == p - 1 then
puts "%d is a perfect number" % [p]
count = count + 1
end
k = kk + 1
kk = kk + k
end
puts "There are %d perfect numbers < %d" % [count, limit]
end
main()

View file

@ -0,0 +1,15 @@
object ChowlaNumbers {
def main(args: Array[String]): Unit = {
println("Chowla Numbers...")
for(n <- 1 to 37){println(s"$n: ${chowlaNum(n)}")}
println("\nPrime Counts...")
for(i <- (2 to 7).map(math.pow(10, _).toInt)){println(f"$i%,d: ${primesPar(i).size}%,d")}
println("\nPerfect Numbers...")
print(perfectsPar(35000000).toVector.sorted.zipWithIndex.map{case (n, i) => f"${i + 1}%,d: $n%,d"}.mkString("\n"))
}
def primesPar(num: Int): ParVector[Int] = ParVector.range(2, num + 1).filter(n => chowlaNum(n) == 0)
def perfectsPar(num: Int): ParVector[Int] = ParVector.range(6, num + 1).filter(n => chowlaNum(n) + 1 == n)
def chowlaNum(num: Int): Int = Iterator.range(2, math.sqrt(num).toInt + 1).filter(n => num%n == 0).foldLeft(0){case (s, n) => if(n*n == num) s + n else s + n + (num/n)}
}

View file

@ -0,0 +1,83 @@
import Foundation
@inlinable
public func chowla<T: BinaryInteger>(n: T) -> T {
stride(from: 2, to: T(Double(n).squareRoot()+1), by: 1)
.lazy
.filter({ n % $0 == 0 })
.reduce(0, {(s: T, m: T) in
m*m == n ? s + m : s + m + (n / m)
})
}
extension Dictionary where Key == ClosedRange<Int> {
subscript(n: Int) -> Value {
get {
guard let key = keys.first(where: { $0.contains(n) }) else {
fatalError("dict does not contain range for \(n)")
}
return self[key]!
}
set {
guard let key = keys.first(where: { $0.contains(n) }) else {
fatalError("dict does not contain range for \(n)")
}
self[key] = newValue
}
}
}
let lock = DispatchSemaphore(value: 1)
var perfect = [Int]()
var primeCounts = [
1...100: 0,
101...1_000: 0,
1_001...10_000: 0,
10_001...100_000: 0,
100_001...1_000_000: 0,
1_000_001...10_000_000: 0
]
for i in 1...37 {
print("chowla(\(i)) = \(chowla(n: i))")
}
DispatchQueue.concurrentPerform(iterations: 35_000_000) {i in
let chowled = chowla(n: i)
if chowled == 0 && i > 1 && i < 10_000_000 {
lock.wait()
primeCounts[i] += 1
lock.signal()
}
if chowled == i - 1 && i > 1 {
lock.wait()
perfect.append(i)
lock.signal()
}
}
let numPrimes = primeCounts
.sorted(by: { $0.key.lowerBound < $1.key.lowerBound })
.reduce(into: [(Int, Int)](), {counts, oneCount in
guard !counts.isEmpty else {
counts.append((oneCount.key.upperBound, oneCount.value))
return
}
counts.append((oneCount.key.upperBound, counts.last!.1 + oneCount.value))
})
for (upper, count) in numPrimes {
print("Number of primes < \(upper) = \(count)")
}
for p in perfect {
print("\(p) is a perfect number")
}

View file

@ -0,0 +1,67 @@
fn chowla(n int) int {
if n < 1 {
panic("argument must be a positive integer")
}
mut sum := 0
for i := 2; i*i <= n; i++ {
if n%i == 0 {
j := n / i
if i == j {
sum += i
} else {
sum += i + j
}
}
}
return sum
}
fn sieve(limit int) []bool {
// True denotes composite, false denotes prime.
// Only interested in odd numbers >= 3
mut c := []bool{len: limit}
for i := 3; i*3 < limit; i += 2 {
if !c[i] && chowla(i) == 0 {
for j := 3 * i; j < limit; j += 2 * i {
c[j] = true
}
}
}
return c
}
fn main() {
for i := 1; i <= 37; i++ {
println("chowla(${i:2}) = ${chowla(i)}")
}
println('')
mut count := 1
mut limit := int(1e7)
c := sieve(limit)
mut power := 100
for i := 3; i < limit; i += 2 {
if !c[i] {
count++
}
if i == power-1 {
println("Count of primes up to ${power:-10} = $count")
power *= 10
}
}
println('')
count = 0
limit = 35000000
for i := 2; ; i++ {
p := (1 << (i -1)) * ((1<<i) - 1)
if p > limit {
break
}
if chowla(p) == p-1 {
println("$p is a perfect number")
count++
}
}
println("There are $count perfect numbers <= 35,000,000")
}

View file

@ -0,0 +1,49 @@
Imports System
Module Program
Function chowla(ByVal n As Integer) As Integer
chowla = 0 : Dim j As Integer, i As Integer = 2
While i * i <= n
j = n / i : If n Mod i = 0 Then chowla += i + (If(i = j, 0, j))
i += 1
End While
End Function
Function sieve(ByVal limit As Integer) As Boolean()
Dim c As Boolean() = New Boolean(limit - 1) {}, i As Integer = 3
While i * 3 < limit
If Not c(i) AndAlso (chowla(i) = 0) Then
Dim j As Integer = 3 * i
While j < limit : c(j) = True : j += 2 * i : End While
End If : i += 2
End While
Return c
End Function
Sub Main(args As String())
For i As Integer = 1 To 37
Console.WriteLine("chowla({0}) = {1}", i, chowla(i))
Next
Dim count As Integer = 1, limit As Integer = CInt((10000000.0)), power As Integer = 100,
c As Boolean() = sieve(limit)
For i As Integer = 3 To limit - 1 Step 2
If Not c(i) Then count += 1
If i = power - 1 Then
Console.WriteLine("Count of primes up to {0,10:n0} = {1:n0}", power, count)
power = power * 10
End If
Next
count = 0 : limit = 35000000
Dim p As Integer, k As Integer = 2, kk As Integer = 3
While True
p = k * kk : If p > limit Then Exit While
If chowla(p) = p - 1 Then
Console.WriteLine("{0,10:n0} is a number that is perfect", p)
count += 1
End If
k = kk + 1 : kk += k
End While
Console.WriteLine("There are {0} perfect numbers <= 35,000,000", count)
If System.Diagnostics.Debugger.IsAttached Then Console.ReadKey()
End Sub
End Module

View file

@ -0,0 +1,59 @@
Imports System.Numerics
Module Program
Function chowla(n As Integer) As Integer
chowla = 0 : Dim j As Integer, i As Integer = 2
While i * i <= n
If n Mod i = 0 Then j = n / i : chowla += i : If i <> j Then chowla += j
i += 1
End While
End Function
Function chowla1(ByRef n As BigInteger, x As Integer) As BigInteger
chowla1 = 1 : Dim j As BigInteger, lim As BigInteger = BigInteger.Pow(2, x - 1)
For i As BigInteger = 2 To lim
If n Mod i = 0 Then j = n / i : chowla1 += i : If i <> j Then chowla1 += j
Next
End Function
Function sieve(ByVal limit As Integer) As Boolean()
Dim c As Boolean() = New Boolean(limit - 1) {}, i As Integer = 3
While i * 3 < limit
If Not c(i) AndAlso (chowla(i) = 0) Then
Dim j As Integer = 3 * i
While j < limit : c(j) = True : j += 2 * i : End While
End If : i += 2
End While
Return c
End Function
Sub Main(args As String())
For i As Integer = 1 To 37
Console.WriteLine("chowla({0}) = {1}", i, chowla(i))
Next
Dim count As Integer = 1, limit As Integer = CInt((10000000.0)), power As Integer = 100,
c As Boolean() = sieve(limit)
For i As Integer = 3 To limit - 1 Step 2
If Not c(i) Then count += 1
If i = power - 1 Then
Console.WriteLine("Count of primes up to {0,10:n0} = {1:n0}", power, count)
power = power * 10
End If
Next
count = 0
Dim p As BigInteger, k As BigInteger = 2, kk As BigInteger = 3
For i As Integer = 2 To 31 ' if you dare, change the 31 to 61 or 89
If {2, 3, 5, 7, 13, 17, 19, 31, 61, 89}.Contains(i) Then
p = k * kk
If chowla1(p, i) = p Then
Console.WriteLine("{0,25:n0} is a number that is perfect", p)
st = DateTime.Now
count += 1
End If
End If
k = kk + 1 : kk += k
Next
Console.WriteLine("There are {0} perfect numbers <= {1:n0}", count, 25 * BigInteger.Pow(10, 18))
If System.Diagnostics.Debugger.IsAttached Then Console.ReadKey()
End Sub
End Module

View file

@ -0,0 +1,111 @@
Option Explicit
Private Declare Function AllocConsole Lib "kernel32.dll" () As Long
Private Declare Function FreeConsole Lib "kernel32.dll" () As Long
Dim mStdOut As Scripting.TextStream
Function chowla(ByVal n As Long) As Long
Dim j As Long, i As Long
i = 2
Do While i * i <= n
j = n \ i
If n Mod i = 0 Then
chowla = chowla + i
If i <> j Then
chowla = chowla + j
End If
End If
i = i + 1
Loop
End Function
Function sieve(ByVal limit As Long) As Boolean()
Dim c() As Boolean
Dim i As Long
Dim j As Long
i = 3
ReDim c(limit - 1)
Do While i * 3 < limit
If Not c(i) Then
If (chowla(i) = 0) Then
j = 3 * i
Do While j < limit
c(j) = True
j = j + 2 * i
Loop
End If
End If
i = i + 2
Loop
sieve = c()
End Function
Sub Display(ByVal s As String)
Debug.Print s
mStdOut.Write s & vbNewLine
End Sub
Sub Main()
Dim i As Long
Dim count As Long
Dim limit As Long
Dim power As Long
Dim c() As Boolean
Dim p As Long
Dim k As Long
Dim kk As Long
Dim s As String * 30
Dim mFSO As Scripting.FileSystemObject
Dim mStdIn As Scripting.TextStream
AllocConsole
Set mFSO = New Scripting.FileSystemObject
Set mStdIn = mFSO.GetStandardStream(StdIn)
Set mStdOut = mFSO.GetStandardStream(StdOut)
For i = 1 To 37
Display "chowla(" & i & ")=" & chowla(i)
Next i
count = 1
limit = 10000000
power = 100
c = sieve(limit)
For i = 3 To limit - 1 Step 2
If Not c(i) Then
count = count + 1
End If
If i = power - 1 Then
RSet s = FormatNumber(power, 0, vbUseDefault, vbUseDefault, True)
Display "Count of primes up to " & s & " = " & FormatNumber(count, 0, vbUseDefault, vbUseDefault, True)
power = power * 10
End If
Next i
count = 0: limit = 35000000
k = 2: kk = 3
Do
p = k * kk
If p > limit Then
Exit Do
End If
If chowla(p) = p - 1 Then
RSet s = FormatNumber(p, 0, vbUseDefault, vbUseDefault, True)
Display s & " is a number that is perfect"
count = count + 1
End If
k = kk + 1
kk = kk + k
Loop
Display "There are " & CStr(count) & " perfect numbers <= 35.000.000"
mStdOut.Write "press enter to quit program."
mStdIn.Read 1
FreeConsole
End Sub

View file

@ -0,0 +1,34 @@
import "./fmt" for Fmt
import "./math" for Int, Nums
var chowla = Fn.new { |n| (n > 1) ? Nums.sum(Int.properDivisors(n)) - 1 : 0 }
for (i in 1..37) Fmt.print("chowla($2d) = $d", i, chowla.call(i))
System.print()
var count = 1
var limit = 1e7
var c = Int.primeSieve(limit, false)
var power = 100
var i = 3
while (i < limit) {
if (!c[i]) count = count + 1
if (i == power - 1) {
Fmt.print("Count of primes up to $,-10d = $,d", power, count)
power = power * 10
}
i = i + 2
}
System.print()
count = 0
limit = 35 * 1e6
i = 2
while (true) {
var p = (1 << (i -1)) * ((1<<i) - 1) // perfect numbers must be of this form
if (p > limit) break
if (chowla.call(p) == p-1) {
Fmt.print("$,d is a perfect number", p)
count = count + 1
}
i = i + 1
}
System.print("There are %(count) perfect numbers <= 35,000,000")

View file

@ -0,0 +1,37 @@
func Chowla(N); \Return sum of divisors
int N, Div, Sum, Quot;
[Div:= 2; Sum:= 0;
loop [Quot:= N/Div;
if Quot < Div then quit;
if Quot = Div and rem(0) = 0 then \N is a square
[Sum:= Sum+Quot; quit];
if rem(0) = 0 then
Sum:= Sum + Div + Quot;
Div:= Div+1;
];
return Sum;
];
int N, C, P;
[for N:= 1 to 37 do
[IntOut(0, N); Text(0, ": ");
IntOut(0, Chowla(N)); CrLf(0);
];
C:= 1; \count 2 as prime
N:= 3; \only check odd numbers
repeat if Chowla(N) = 0 then \N is prime
C:= C+1;
case N+1 of 100, 1000, 10_000, 100_000, 1_000_000, 10_000_000:
[Text(0, "There are "); IntOut(0, C); Text(0, " primes < ");
IntOut(0, N+1); CrLf(0)]
other [];
N:= N+2;
until N >= 10_000_000;
P:= 1; \perfect numbers are of form: 2^(P-1) * (2^P - 1)
loop [P:= P*2;
N:= P*(P*2-1);
if N > 35_000_000 then quit;
if Chowla(N) = N-1 then \N is perfect
[IntOut(0, N); CrLf(0)];
];
]

View file

@ -0,0 +1,24 @@
fcn chowla(n){
if(n<1)
throw(Exception.ValueError("Chowla function argument must be positive"));
sum:=0;
foreach i in ([2..n.toFloat().sqrt()]){
if(n%i == 0){
j:=n/i;
if(i==j) sum+=i;
else sum+=i+j;
}
}
sum
}
fcn chowlaSieve(limit){
// True denotes composite, false denotes prime.
// Only interested in odd numbers >= 3
c:=Data(limit+100).fill(0); # slop at the end (for reverse wrap around)
foreach i in ([3..limit/3,2]){
if(not c[i] and chowla(i)==0)
{ foreach j in ([3*i..limit,2*i]){ c[j]=True } }
}
c
}

View file

@ -0,0 +1,26 @@
fcn testChowla{
println("The first 37 Chowla numbers:\n",
[1..37].apply(chowla).concat(" ","[","]"), "\n");
count,limit,power := 1, (1e7).toInt(), 100;
c:=chowlaSieve(limit);
foreach i in ([3..limit-1,2]){
if(not c[i]) count+=1;
if(i == power - 1){
println("The count of the primes up to %10,d is %8,d".fmt(power,count));
power*=10;
}
}
println();
count, limit = 0, 35_000_000;
foreach i in ([2..]){
p:=(1).shiftLeft(i - 1) * ((1).shiftLeft(i)-1); // perfect numbers must be of this form
if(p>limit) break;
if(p-1 == chowla(p)){
println("%,d is a perfect number".fmt(p));
count+=1;
}
}
println("There are %,d perfect numbers <= %,d".fmt(count,limit));
}();