/* The Liouville function on a integer n is L(n) = (-1)^r where r is thenumberofprimefactorsintheprimefactorizationofn(L(1)=1). Thisprogramiscalledas sumliouvillebeginend andprintsthesumofL(n)fornfrom'begin'to'end'. Compilewith gcc-O2-Wall-g-osumliouvillesumliouville.c-lm
inlinevoid do_p(long p)
{ long q, k, start; for (q = p; q <= end; q *= p){
start = (-begin) % q + 1; if (start <= 0) start += q; for (k = start; k <= l; k += q){
res[k] = -res[k];
found[k] *= p;
}
} /* printf("\n");for(k=1;k<=l;k++)printf("%ld",(long)res[k]); printf("\n");for(k=1;k<=l;k++)printf("%ld",found[k]);
printf("\n"); */
}
int main(int argc, char *argv[])
{ long i, k, p, n, n2, off, sum; char *erat;
begin = atol(argv[1]);
end = atol(argv[2]);
/* compute primes */
n = lsqrt(end)+1;
n2 = n/2;
erat = (char*) malloc((n2+1) * sizeof(char)); for (i=0; (2*i+1)*(2*i+1) <= n; ) {
i++; while (erat[i] == 1) i++;
p = 2*i+1; for (k = (p*p-1)/2; k <= n2; k += p) erat[k] = 1;
}
/* init memory */
l = end - begin + 1;
res = (char*) malloc((l+1)*sizeof(char)); for(i=1; i<=l; i++) res[i] = 1;
found = (long*) malloc((l+1)*sizeof(long)); for(i=1; i<=l; i++) found[i] = 1;
/* mark parity of number of prime factors */
do_p(2); for (i = 1; i <= n2; i++) { if (erat[i] == 0) {do_p(2*i + 1); }//printf("%ld ",2*i+1); fflush(stdout);}
}
/* compute sum */
sum = 0;
off = begin-1; for (i=1; i<=l; i++) { if (found[i] < off+i) sum -= res[i]; /* one more prime */ else sum += res[i];
}
printf("%ld\n", sum); return0;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.