Program for Mobius Function
Mobius Function is a multiplicative function that is used in combinatorics. It has one of three possible values -1, 0 and 1.
Examples:
Input : 6
Output : 1
Solution: Prime Factors: 2 3.
Therefore p = 2, (-1)^p = 1
Input: 49
Output: 0
Solution: Prime Factors: 7 ( occurs twice).
Since the prime factor occurs twice answer
is 0.
Input: 3
Output: -1
Solution: Prime Factors: 3. Therefore p = 1,
(-1) ^ p =-1
Input : 78
Output : 1
Solution: Prime Factors: 3, 13. Therefore p = 2,
(-1)^p = 1
Method 1 (Simple)
We iterate through all numbers i smaller than or equal to N. For every number we check if it divides N. If yes, we check if it’s also prime. If both conditions are satisfied, we check if its square also divides N. If yes, we return 0. If the square doesn’t divide, we increment count of prime factors. Finally, we return 1 if there are an even number of prime factors and return -1 if there are odd number of prime factors.
C++
Java
import java.io.*;
public class GFG {
static boolean isPrime( int n)
{
if (n < 2 )
return false ;
for ( int i = 2 ; i * i <= n; i++)
if (n % i == 0 )
return false ;
return true ;
}
static int mobius( int N)
{
if (N == 1 )
return 1 ;
int p = 0 ;
for ( int i = 1 ; i <= N; i++) {
if (N % i == 0 && isPrime(i)) {
if (N % (i * i) == 0 )
return 0 ;
else
p++;
}
}
return (p % 2 != 0 ) ? - 1 : 1 ;
}
static public void main(String[] args)
{
int N = 17 ;
System.out.println( "Mobius Functions M(N) at " +
" N = " + N + " is: " + mobius(N));
System.out.println( "Mobius Functions M(N) at " +
" N = " + 25 + " is: " + mobius( 25 ));
System.out.println( "Mobius Functions M(N) at " +
" N = " + 6 + " is: " + mobius( 6 ));
}
}
|
Python3
C#
using System;
public class GFG
{
static bool isPrime( int n)
{
if (n == 2)
return true ;
if (n % 2 == 0)
return false ;
for ( int i = 3; i * i <= n / 2; i += 2)
if (n % i == 0)
return false ;
return true ;
}
static int mobius( int N)
{
if (N == 1)
return 1;
int p = 0;
for ( int i = 2; i <= N; i++)
{
if (N % i == 0 && isPrime(i)) {
if (N % (i * i) == 0)
return 0;
else
p++;
}
}
return (p % 2 != 0) ? -1 : 1;
}
static public void Main()
{
Console.WriteLine( "Mobius Functions M(N) at " +
"N = " + 17 + " is: " + mobius(17));
Console.WriteLine( "Mobius Functions M(N) at " +
"N = " + 25 + " is: " + mobius(25));
Console.WriteLine( "Mobius Functions M(N) at " +
"N = " + 6 + " is: " + mobius(6));
}
}
|
PHP
<?php
function isPrime( $n )
{
if ( $n < 2)
return false;
for ( $i = 2; $i * $i <= $n ; $i ++)
if ( $n % $i == 0)
return false;
return true;
}
function mobius( $N )
{
if ( $N == 1)
return 1;
$p = 0;
for ( $i = 1; $i <= $N ; $i ++) {
if ( $N % $i == 0 && isPrime( $i )) {
if ( $N % ( $i * $i ) == 0)
return 0;
else
$p ++;
}
}
return ( $p % 2 != 0) ? -1 : 1;
}
$N = 17;
echo "Mobius Functions M(N) at N = " , $N , " is: "
, mobius( $N ) , "\n" ;
echo "Mobius Functions M(N) at N = " ,25, " is: "
, mobius(25), "\n" ;
echo "Mobius Functions M(N) at N = " ,6, " is: "
, mobius(6) ;
?>
|
Javascript
<script>
function isPrime(n)
{
if (n < 2)
return false ;
for (let i = 2; i * i <= n; i++)
if (n % i == 0)
return false ;
return true ;
}
function mobius(N)
{
if (N == 1)
return 1;
let p = 0;
for (let i = 1; i <= N; i++) {
if (N % i == 0 && isPrime(i)) {
if (N % (i * i) == 0)
return 0;
else
p++;
}
}
return (p % 2 != 0) ? -1 : 1;
}
let N = 17;
document.write( "Mobius Functions M(N) at " +
" N = " + N + " is: " + mobius(N) + "<br/>" );
document.write( "Mobius Functions M(N) at " +
" N = " + 25 + " is: " + mobius(25) + "<br/>" );
document.write( "Mobius Functions M(N) at " +
" N = " + 6 + " is: " + mobius(6) + "<br/>" );
</script>
|
Output:
Mobius Functions M(N) at N = 17 is: -1
Mobius Functions M(N) at N = 25 is: 0
Mobius Functions M(N) at N = 6 is: 1
Time Complexity: O(n?n )
Auxiliary Space: O(1)
Method 2 (Efficient)
The idea is based on efficient program to print all prime factors of a given number. The interesting thing is, we do not need inner while loop here because if a number divides more than once, we can immediately return 0.
C++
# include <bits/stdc++.h>
using namespace std;
int mobius( int n)
{
int p = 0;
if (n%2 == 0)
{
n = n/2;
p++;
if (n % 2 == 0)
return 0;
}
for ( int i = 3; i <= sqrt (n); i = i+2)
{
if (n%i == 0)
{
n = n/i;
p++;
if (n % i == 0)
return 0;
}
}
return (p % 2 == 0)? -1 : 1;
}
int main()
{
int N = 17;
cout << "Mobius Functions M(N) at N = " << N << " is: "
<< mobius(N) << endl;
cout << "Mobius Functions M(N) at N = " << 25 << " is: "
<< mobius(25) << endl;
cout << "Mobius Functions M(N) at N = " << 6 << " is: "
<< mobius(6) << endl;
}
|
Java
import java.io.*;
class GFG {
static int mobius( int n)
{
int p = 0 ;
if (n % 2 == 0 )
{
n = n / 2 ;
p++;
if (n % 2 == 0 )
return 0 ;
}
for ( int i = 3 ; i <= Math.sqrt(n);
i = i+ 2 )
{
if (n % i == 0 )
{
n = n / i;
p++;
if (n % i == 0 )
return 0 ;
}
}
return (p % 2 == 0 )? - 1 : 1 ;
}
public static void main (String[] args)
{
int N = 17 ;
System.out.println( "Mobius Functions"
+ " M(N) at N = " + N + " is: "
+ mobius(N));
System.out.println ( "Mobius Functions"
+ "M(N) at N = " + 25 + " is: "
+ mobius( 25 ));
System.out.println( "Mobius Functions"
+ "M(N) at N = " + 6 + " is: "
+ mobius( 6 ));
}
}
|
Python3
C#
using System;
class GFG {
static int mobius( int n)
{
int p = 0;
if (n % 2 == 0)
{
n = n / 2;
p++;
if (n % 2 == 0)
return 0;
}
for ( int i = 3; i <= Math.Sqrt(n);
i = i+2)
{
if (n % i == 0)
{
n = n / i;
p++;
if (n % i == 0)
return 0;
}
}
return (p % 2 == 0)? -1 : 1;
}
public static void Main ()
{
int N = 17;
Console.WriteLine( "Mobius Functions"
+ " M(N) at N = " + N + " is: "
+ mobius(N));
Console.WriteLine( "Mobius Functions"
+ "M(N) at N = " + 25 + " is: "
+ mobius(25));
Console.WriteLine( "Mobius Functions"
+ "M(N) at N = " + 6 + " is: "
+ mobius(6));
}
}
|
PHP
<?php
function mobius( $n )
{
$p = 0;
if ( $n % 2 == 0)
{
$n = $n / 2;
$p ++;
if ( $n % 2 == 0)
return 0;
}
for ( $i = 3; $i <= sqrt( $n ); $i = $i + 2)
{
if ( $n % $i == 0)
{
$n = $n / $i ;
$p ++;
if ( $n % $i == 0)
return 0;
}
}
return ( $p % 2 == 0)? -1 : 1;
}
$N = 17;
echo "Mobius Functions M(N) at N = " , $N , " is: "
, mobius( $N ), "\n" ;
echo "Mobius Functions M(N) at N = " , 25 , " is: "
, mobius(25), "\n" ;
echo "Mobius Functions M(N) at N = " , 6 , " is: "
, mobius(6) ;
?>
|
Javascript
<script>
function mobius(n)
{
let p = 0;
if (n % 2 == 0)
{
n = parseInt(n / 2, 10);
p++;
if (n % 2 == 0)
return 0;
}
for (let i = 3; i <= Math.sqrt(n); i = i+2)
{
if (n % i == 0)
{
n = parseInt(n / i, 10);
p++;
if (n % i == 0)
return 0;
}
}
return (p % 2 == 0)? -1 : 1;
}
let N = 17;
document.write( "Mobius Functions"
+ " M(N) at N = " + N + " is: "
+ mobius(N) + "</br>" );
document.write( "Mobius Functions"
+ "M(N) at N = " + 25 + " is: "
+ mobius(25) + "</br>" );
document.write( "Mobius Functions"
+ "M(N) at N = " + 6 + " is: "
+ mobius(6));
</script>
|
Output:
Mobius Functions M(N) at N = 17 is: -1
Mobius Functions M(N) at N = 25 is: 0
Mobius Functions M(N) at N = 6 is: 1
Time Complexity: O(?n)
Auxiliary Space: O(1)
Please suggest if someone has a better solution which is more efficient in terms of space and time.
References
1) http://mathworld.wolfram.com/MobiusFunction.html
2) https://en.wikipedia.org/wiki/M%C3%B6bius_function
3) https://en.wikipedia.org/wiki/Completely_multiplicative_function
Last Updated :
08 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...