69 lines
1.5 KiB
Plaintext
69 lines
1.5 KiB
Plaintext
|
|
// Public domain / CC0. Use freely for any purpose. RoyR 2026
|
||
|
|
// primes.cm - Prime number calculator
|
||
|
|
// Demonstrates: algorithms, loops, mathematical operations
|
||
|
|
|
||
|
|
void printf(uint8 *fmt);
|
||
|
|
|
||
|
|
int32 is_prime(int32 n) {
|
||
|
|
if (n <= 1) return 0;
|
||
|
|
if (n <= 3) return 1;
|
||
|
|
if (n % 2 == 0 || n % 3 == 0) return 0;
|
||
|
|
|
||
|
|
int32 i = 5;
|
||
|
|
while (i * i <= n) {
|
||
|
|
if (n % i == 0 || n % (i + 2) == 0) {
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
i = i + 6;
|
||
|
|
}
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 nth_prime(int32 n) {
|
||
|
|
if (n == 1) return 2;
|
||
|
|
|
||
|
|
int32 count = 1;
|
||
|
|
int32 candidate = 3;
|
||
|
|
|
||
|
|
while (count < n) {
|
||
|
|
if (is_prime(candidate)) {
|
||
|
|
count = count + 1;
|
||
|
|
}
|
||
|
|
candidate = candidate + 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
return candidate - 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 count_primes_under(int32 limit) {
|
||
|
|
int32 count = 0;
|
||
|
|
for (int32 i = 2; i < limit; i = i + 1) {
|
||
|
|
if (is_prime(i)) {
|
||
|
|
count = count + 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return count;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 main(void) {
|
||
|
|
printf("First 20 prime numbers:\n");
|
||
|
|
for (int32 i = 1; i <= 20; i = i + 1) {
|
||
|
|
printf("%d ", nth_prime(i));
|
||
|
|
if (i % 10 == 0) printf("\n");
|
||
|
|
}
|
||
|
|
printf("\n");
|
||
|
|
|
||
|
|
int32 limit = 100;
|
||
|
|
int32 count = count_primes_under(limit);
|
||
|
|
printf("\nThere are %d primes less than %d\n", count, limit);
|
||
|
|
|
||
|
|
printf("\nPrime check:\n");
|
||
|
|
int32 test_nums[8] = { 1, 2, 15, 17, 97, 100, 101, 121 };
|
||
|
|
for (int32 i = 0; i < 8; i = i + 1) {
|
||
|
|
int32 num = test_nums[i];
|
||
|
|
printf(" %d is %s\n", num, is_prime(num) ? "prime" : "not prime");
|
||
|
|
}
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|