60 lines
1.6 KiB
Java
60 lines
1.6 KiB
Java
public class MöbiusFunction {
|
|
|
|
public static void main(String[] args) {
|
|
System.out.printf("First 199 terms of the möbius function are as follows:%n ");
|
|
for ( int n = 1 ; n < 200 ; n++ ) {
|
|
System.out.printf("%2d ", möbiusFunction(n));
|
|
if ( (n+1) % 20 == 0 ) {
|
|
System.out.printf("%n");
|
|
}
|
|
}
|
|
}
|
|
|
|
private static int MU_MAX = 1_000_000;
|
|
private static int[] MU = null;
|
|
|
|
// Compute mobius function via sieve
|
|
private static int möbiusFunction(int n) {
|
|
if ( MU != null ) {
|
|
return MU[n];
|
|
}
|
|
|
|
// Populate array
|
|
MU = new int[MU_MAX+1];
|
|
int sqrt = (int) Math.sqrt(MU_MAX);
|
|
for ( int i = 0 ; i < MU_MAX ; i++ ) {
|
|
MU[i] = 1;
|
|
}
|
|
|
|
for ( int i = 2 ; i <= sqrt ; i++ ) {
|
|
if ( MU[i] == 1 ) {
|
|
// for each factor found, swap + and -
|
|
for ( int j = i ; j <= MU_MAX ; j += i ) {
|
|
MU[j] *= -i;
|
|
}
|
|
// square factor = 0
|
|
for ( int j = i*i ; j <= MU_MAX ; j += i*i ) {
|
|
MU[j] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
for ( int i = 2 ; i <= MU_MAX ; i++ ) {
|
|
if ( MU[i] == i ) {
|
|
MU[i] = 1;
|
|
}
|
|
else if ( MU[i] == -i ) {
|
|
MU[i] = -1;
|
|
}
|
|
else if ( MU[i] < 0 ) {
|
|
MU[i] = 1;
|
|
}
|
|
else if ( MU[i] > 0 ) {
|
|
MU[i] = -1;
|
|
}
|
|
}
|
|
return MU[n];
|
|
}
|
|
|
|
}
|