Program for Mobius Function
Last Updated :
20 Jan, 2025
Mobius Function \mu(n) is a multiplicative function that is used in combinatorics. It has one of three possible values -1, 0 and 1.
For any positive integer n, \mu(n) = \begin{cases} 1, & \text{ if } n=1, \\ 0, & \text{ if } a^2 \mid n \text{ for some } a > 1 \text{ (i.e., } n \text{ has a squared prime factor)}, \\ (-1)^k, & \text { if } n \text{ is the product of } k \text{ distinct primes.} \end{cases}
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++
// CPP Program to evaluate Mobius Function
// M(N) = 1 if N = 1
// M(N) = 0 if any prime factor of N is contained twice
// M(N) = (-1)^(no of distinct prime factors)
#include<iostream>
using namespace std;
// Function to check if n is prime or not
bool isPrime(int n)
{
if (n < 2)
return false;
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
return false;
return true;
}
int mobius(int N)
{
// Base Case
if (N == 1)
return 1;
// For a prime factor i check if i^2 is also
// a factor.
int p = 0;
for (int i = 1; i <= N; i++) {
if (N % i == 0 && isPrime(i)) {
// Check if N is divisible by i^2
if (N % (i * i) == 0)
return 0;
else
// i occurs only once, increase p
p++;
}
}
// All prime factors are contained only once
// Return 1 if p is even else -1
return (p % 2 != 0)? -1 : 1;
}
// Driver code
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
// Java program for mobius function
import java.io.*;
public class GFG {
// C# Program to evaluate Mobius
// Function: M(N) = 1 if N = 1
// M(N) = 0 if any prime factor
// of N is contained twice
// M(N) = (-1)^(no of distinct
// prime factors)
// Function to check if n is
// prime or not
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)
{
// Base Case
if (N == 1)
return 1;
// For a prime factor i check if
// i^2 is also a factor.
int p = 0;
for (int i = 1; i <= N; i++) {
if (N % i == 0 && isPrime(i)) {
// Check if N is divisible by i^2
if (N % (i * i) == 0)
return 0;
else
// i occurs only once, increase p
p++;
}
}
// All prime factors are contained only
// once Return 1 if p is even else -1
return (p % 2 != 0) ? -1 : 1;
}
// Driver code
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));
}
}
// This code is contributed by vt_m
Python3
# Python Program to
# evaluate Mobius def
# M(N) = 1 if N = 1
# M(N) = 0 if any
# prime factor of
# N is contained twice
# M(N) = (-1)^(no of
# distinct prime factors)
# def to check if
# n is prime or not
def isPrime(n) :
if (n < 2) :
return False
for i in range(2, n + 1) :
if (i * i <= n and n % i == 0) :
return False
return True
def mobius(N) :
# Base Case
if (N == 1) :
return 1
# For a prime factor i
# check if i^2 is also
# a factor.
p = 0
for i in range(1, N + 1) :
if (N % i == 0 and
isPrime(i)) :
# Check if N is
# divisible by i^2
if (N % (i * i) == 0) :
return 0
else :
# i occurs only once,
# increase p
p = p + 1
# All prime factors are
# contained only once
# Return 1 if p is even
# else -1
if(p % 2 != 0) :
return -1
else :
return 1
# Driver Code
N = 17
print ("Mobius defs M(N) at N = {} is: {}" .
format(N, mobius(N)),end = "\n")
print ("Mobius defs M(N) at N = {} is: {}" .
format(25, mobius(25)),end = "\n")
print ("Mobius defs M(N) at N = {} is: {}" .
format(6, mobius(6)),end = "\n")
# This code is contributed by
# Manish Shaw(manishshaw1)
C#
// C# Program to evaluate Mobius Function
using System;
public class GFG
{
// M(N) = 1 if N = 1
// M(N) = 0 if any prime factor
// of N is contained twice
// M(N) = (-1)^(no of distinct
// prime factors)
// Function to check if n is
// prime or not
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)
{
// Base Case
if (N == 1)
return 1;
// For a prime factor i check
// if i^2 is also a factor.
int p = 0;
for (int i = 2; i <= N; i++)
{
if (N % i == 0 && isPrime(i)) {
// Check if N is divisible by i^2
if (N % (i * i) == 0)
return 0;
else
// i occurs only once, increase p
p++;
}
}
// All prime factors are contained only
// once Return 1 if p is even else -1
return (p % 2 != 0) ? -1 : 1;
}
// Driver code
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));
}
}
// This code is contributed by vt_m
JavaScript
<script>
// JavaScript Program to evaluate Mobius
// Function: M(N) = 1 if N = 1
// M(N) = 0 if any prime factor
// of N is contained twice
// M(N) = (-1)^(no of distinct
// prime factors)
// Function to check if n is
// prime or not
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)
{
// Base Case
if (N == 1)
return 1;
// For a prime factor i check if
// i^2 is also a factor.
let p = 0;
for (let i = 1; i <= N; i++) {
if (N % i == 0 && isPrime(i)) {
// Check if N is divisible by i^2
if (N % (i * i) == 0)
return 0;
else
// i occurs only once, increase p
p++;
}
}
// All prime factors are contained only
// once Return 1 if p is even else -1
return (p % 2 != 0) ? -1 : 1;
}
// Driver code
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>
PHP
<?php
// PHP Program to evaluate Mobius Function
// M(N) = 1 if N = 1
// M(N) = 0 if any prime factor of
// N is contained twice
// M(N) = (-1)^(no of distinct prime factors)
// Function to check if n is prime or not
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)
{
// Base Case
if ($N == 1)
return 1;
// For a prime factor i
// check if i^2 is also
// a factor.
$p = 0;
for ($i = 1; $i <= $N; $i++) {
if ($N % $i == 0 && isPrime($i)) {
// Check if N is divisible by i^2
if ($N % ($i * $i) == 0)
return 0;
else
// i occurs only once, increase p
$p++;
}
}
// All prime factors are
// contained only once
// Return 1 if p is even
// else -1
return ($p % 2 != 0) ? -1 : 1;
}
// Driver Code
$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) ;
// This code is contributed by nitin mittal.
?>
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++
// Program to print all prime factors
# include <bits/stdc++.h>
using namespace std;
// Returns value of mobius()
int mobius(int n)
{
int p = 0;
// Handling 2 separately
if (n%2 == 0)
{
n = n/2;
p++;
// If 2^2 also divides N
if (n % 2 == 0)
return 0;
}
// Check for all other prime factors
for (int i = 3; i <= sqrt(n); i = i+2)
{
// If i divides n
if (n%i == 0)
{
n = n/i;
p++;
// If i^2 also divides N
if (n % i == 0)
return 0;
}
}
return (p % 2 == 0)? -1 : 1;
}
// Driver code
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
// Java program to print all prime factors
import java.io.*;
class GFG {
// Returns value of mobius()
static int mobius(int n)
{
int p = 0;
// Handling 2 separately
if (n % 2 == 0)
{
n = n / 2;
p++;
// If 2^2 also divides N
if (n % 2 == 0)
return 0;
}
// Check for all other prime factors
for (int i = 3; i <= Math.sqrt(n);
i = i+2)
{
// If i divides n
if (n % i == 0)
{
n = n / i;
p++;
// If i^2 also divides N
if (n % i == 0)
return 0;
}
}
return (p % 2 == 0)? -1 : 1;
}
// Driver code
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));
}
}
// This code is contributed by anuj_67.
Python3
# Python Program to evaluate
# Mobius def M(N) = 1 if N = 1
# M(N) = 0 if any prime factor
# of N is contained twice
# M(N) = (-1)^(no of distinct
# prime factors)
import math
# def to check if n
# is prime or not
def isPrime(n) :
if (n < 2) :
return False
for i in range(2, n + 1) :
if (n % i == 0) :
return False
i = i * i
return True
def mobius(n) :
p = 0
# Handling 2 separately
if (n % 2 == 0) :
n = int(n / 2)
p = p + 1
# If 2^2 also
# divides N
if (n % 2 == 0) :
return 0
# Check for all
# other prime factors
for i in range(3, int(math.sqrt(n)) + 1) :
# If i divides n
if (n % i == 0) :
n = int(n / i)
p = p + 1
# If i^2 also
# divides N
if (n % i == 0) :
return 0
i = i + 2
if(p % 2 == 0) :
return -1
else :
return 1
# Driver Code
N = 17
print ("Mobius defs M(N) at N = {} is: {}\n" .
format(N, mobius(N)));
print ("Mobius defs M(N) at N = 25 is: {}\n" .
format(mobius(25)));
print ("Mobius defs M(N) at N = 6 is: {}\n" .
format(mobius(6)));
# This code is contributed by
# Manish Shaw(manishshaw1)
C#
// C# program to print all prime factors
using System;
class GFG {
// Returns value of mobius()
static int mobius(int n)
{
int p = 0;
// Handling 2 separately
if (n % 2 == 0)
{
n = n / 2;
p++;
// If 2^2 also divides N
if (n % 2 == 0)
return 0;
}
// Check for all other prime factors
for (int i = 3; i <= Math.Sqrt(n);
i = i+2)
{
// If i divides n
if (n % i == 0)
{
n = n / i;
p++;
// If i^2 also divides N
if (n % i == 0)
return 0;
}
}
return (p % 2 == 0)? -1 : 1;
}
// Driver Code
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));
}
}
// This code is contributed by anuj_67.
JavaScript
<script>
// JavaScript program to print all prime factors
// Returns value of mobius()
function mobius(n)
{
let p = 0;
// Handling 2 separately
if (n % 2 == 0)
{
n = parseInt(n / 2, 10);
p++;
// If 2^2 also divides N
if (n % 2 == 0)
return 0;
}
// Check for all other prime factors
for (let i = 3; i <= Math.sqrt(n); i = i+2)
{
// If i divides n
if (n % i == 0)
{
n = parseInt(n / i, 10);
p++;
// If i^2 also divides N
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>
PHP
<?php
// PHP Program to print
// all prime factors
// Returns value of mobius()
function mobius( $n)
{
$p = 0;
// Handling 2 separately
if ($n % 2 == 0)
{
$n = $n / 2;
$p++;
// If 2^2 also divides N
if ($n % 2 == 0)
return 0;
}
// Check for all
// other prime factors
for ( $i = 3; $i <= sqrt($n); $i = $i + 2)
{
// If i divides n
if ($n % $i == 0)
{
$n = $n / $i;
$p++;
// If i^2 also divides N
if ($n % $i == 0)
return 0;
}
}
return ($p % 2 == 0)? -1 : 1;
}
// Driver code
$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) ;
// This code is contributed by anuj_67.
?>
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
Similar Reads
Program for Mobius Function | Set 2
Given an integer N. The task is to find Mobius function of all numbers from 1 to N.Examples: Input: N = 5 Output: 1 -1 -1 0 -1 Input: N = 10 Output: 1 -1 -1 0 -1 1 -1 0 0 1 Approach: The idea is to first find the least prime factor of all the numbers from 1 to N using Sieve of Eratosthenes then usin
7 min read
proj() function for Complex Numbers in C++
The proj() function is a built-in function and is defined in the complex header file. This function is used to find the projection of complex number z onto the Riemann sphere. Syntax: template <class T> complex<T> proj (const complex<T>& z); Parameter: z: This method takes a ma
2 min read
Program for Markov matrix
Given a m x n 2D matrix, check if it is a Markov Matrix.Markov Matrix : The matrix in which the sum of each row is equal to 1. Example of Markov Matrix Examples: Input : 1 0 0 0.5 0 0.5 0 0 1 Output : yes Explanation : Sum of each row results to 1, therefore it is a Markov Matrix. Input : 1 0 0 0 0
5 min read
Prime Factor Program
Given an integer n, write a program to find and print all the prime factors of n. A prime factor is a prime number that divides n exactly (without leaving a remainder).Examples:Input: n = 36Output: 2 2 3 3Explanation: For n = 36, dividing by 2 twice and 3 twice gives the prime factors 2, 2, 3, 3.Inp
8 min read
PHP | gmp_jacobi() Function
The gmp_jacobi() function is an in-built function in PHP which computes the Jacobi symbol of two GMP numbers (GNU Multiple Precision : For large numbers) $num1 and $num2 passed as parameters to the function and returns it. $num2 must be positive and odd. Syntax : gmp_jacobi($num1, $num2) Parameters
2 min read
modf() function - Python
modf() function is an inbuilt function in Python that returns the fractional and integer parts of the number in a two-item tuple. Both parts have the same sign as the number. The integer part is returned as a float. Example:Pythonimport math # modf() function used with a positive number print("math.
3 min read
PHP | gmp_xor() Function
The gmp_xor() is an in-built function in PHP which is used to calculate the XOR of 2 GMP numbers (GNU Multiple Precision : For large numbers). Syntax: gmp_xor( $num1, $num2 ) Parameters: This function accepts two GMP numbers $num1 and $num2 as mandatory parameters shown in the above syntax. These pa
2 min read
Modulus function in C++ STL
Modulus function is used to return the value of the modulus between its two arguments. It works same as modulus operator works. template struct modulus : binary_function { T operator() (const T& x, const T& y) const { return x%y; } }; Member types: Type of first argument Type of second argum
2 min read
mbrtowc() function in C/C++
The mbrtowc() function in C/C++ converts multibyte sequence to wide characters. This function returns the length in bytes of a multibyte character. The multibyte character pointed by s is converted to a value of type wchar_t and stored at the location pointed by pwc. If s points to a null character,
3 min read
fma() function in C++
The fma() function takes three arguments a, b and c, and returns a*b+c without losing precision. The fma() function is defined in the cmath header file. If any argument passed to fma() is long double, the return type is long double. If not, the return type is double. Syntax: double fma(double a, dou
2 min read