Given an integer ‘n’, print the first ‘n’ terms of the Moser-de Bruijn Sequence. Moser-de Bruijn sequence is the sequence obtained by adding up the distinct powers of the number 4 (For example, 1, 4, 16, 64, etc).
Examples:
Input : 5
Output : 0 1 4 5 16
Input : 10
Output : 0 1 4 5 16 17 20 21 64 65
It is observed that the terms of the sequence follow the recurrence relation :
1) S(2 * n) = 4 * S(n)
2) S(2 * n + 1) = 4 * S(n) + 1
with S(0) = 0 and S(1) = 1
It may be noted here that any number which is the sum of non-distinct powers of 4 is not a part of the sequence. For example, 8 is not a part of the sequence because it is formed as the sum of non-distinct powers of 4, which are 4 and 4.
Thus, any number which is not a power of 4 and is present in the sequence must be the sum of the distinct powers of 4.
For example, 21 is a part of the sequence, even though it is not a power of 4, because it is the sum of the distinct powers of 4, which are 1, 4, and 16.
Employ the recurrence relation discussed above to generate the sequence efficiently.
C++
#include <bits/stdc++.h>
using namespace std;
int gen( int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else if (n % 2 == 0)
return 4 * gen(n / 2);
else if (n % 2 == 1)
return 4 * gen(n / 2) + 1;
}
void moserDeBruijn( int n)
{
for ( int i = 0; i < n; i++)
cout << gen(i) << " " ;
cout << "\n" ;
}
int main()
{
int n = 15;
cout << "First " << n << " terms of "
<< "Moser-de Bruijn Sequence : \n" ;
moserDeBruijn(n);
return 0;
}
|
Java
class GFG
{
public static int gen( int n)
{
if (n == 0 )
return 0 ;
else if (n == 1 )
return 1 ;
else if (n % 2 == 0 )
return 4 * gen(n / 2 );
else if (n % 2 == 1 )
return 4 * gen(n / 2 ) + 1 ;
return 0 ;
}
public static void moserDeBruijn( int n)
{
for ( int i = 0 ; i < n; i++)
System.out.print(gen(i) + " " );
System.out.println();
}
public static void main(String args[])
{
int n = 15 ;
System.out.println( "First " + n +
" terms of " +
"Moser-de Bruijn Sequence : " );
moserDeBruijn(n);
}
}
|
Python3
def gen(n):
if n = = 0 :
return 0
elif n = = 1 :
return 1
elif n % 2 = = 0 :
return 4 * gen(n / / 2 )
elif n % 2 = = 1 :
return 4 * gen(n / / 2 ) + 1
def moserDeBruijn(n):
for i in range (n):
print (gen(i), end = " " )
n = 15
print ( "First" , n, "terms of " ,
"Moser-de Bruijn Sequence:" )
moserDeBruijn(n)
|
C#
using System;
class GFG {
public static int gen( int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else if (n % 2 == 0)
return 4 * gen(n / 2);
else if (n % 2 == 1)
return 4 * gen(n / 2) + 1;
return 0;
}
public static void moserDeBruijn( int n)
{
for ( int i = 0; i < n; i++)
Console.Write(gen(i) + " " );
Console.WriteLine();
}
public static void Main()
{
int n = 15;
Console.WriteLine( "First " + n +
" terms of " +
"Moser-de Bruijn Sequence : " );
moserDeBruijn(n);
}
}
|
PHP
<?php
function gen( $n )
{
if ( $n == 0)
return 0;
else if ( $n == 1)
return 1;
else if ( $n % 2 == 0)
return 4 * gen( $n / 2);
else if ( $n % 2 == 1)
return 4 * gen( $n / 2) + 1;
}
function moserDeBruijn( $n )
{
for ( $i = 0; $i < $n ; $i ++)
echo (gen( $i ) . " " );
echo ( "\n" );
}
$n = 15;
echo ( "First " . $n . " terms of " .
"Moser-de Bruijn Sequence : \n" );
echo (moserDeBruijn( $n ));
?>
|
Javascript
<script>
function gen(n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else if (n % 2 == 0)
return 4 * gen(parseInt(n / 2, 10));
else if (n % 2 == 1)
return 4 * gen(parseInt(n / 2, 10)) + 1;
return 0;
}
function moserDeBruijn(n)
{
for (let i = 0; i < n; i++)
document.write(gen(i) + " " );
document.write( "</br>" );
}
let n = 15;
document.write( "First " + n + " terms of " +
"Moser-de Bruijn Sequence : " + "</br>" );
moserDeBruijn(n);
</script>
|
Output :
First 15 terms of Moser-de Bruijn Sequence :
0 1 4 5 16 17 20 21 64 65 68 69 80 81 84
Time complexity: O(log2n)
Auxiliary Space: O(1)
Dynamic Programming Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int gen( int n)
{
int S[n+1];
S[0] = 0;
S[1] = 1;
for ( int i = 2; i <= n; i++)
{
if (i % 2 == 0)
S[i] = 4 * S[i / 2];
else
S[i] = 4 * S[i / 2] + 1;
}
return S[n];
}
void moserDeBruijn( int n)
{
for ( int i = 0; i < n; i++)
cout << gen(i) << " " ;
cout << "\n" ;
}
int main()
{
int n = 15;
cout << "First " << n << " terms of "
<< "Moser-de Bruijn Sequence : \n" ;
moserDeBruijn(n);
return 0;
}
|
Java
class GFG
{
static int gen( int n)
{
int []S = new int [n + 1 ];
S[ 0 ] = 0 ;
if (n != 0 )
S[ 1 ] = 1 ;
for ( int i = 2 ; i <= n; i++)
{
if (i % 2 == 0 )
S[i] = 4 * S[i / 2 ];
else
S[i] = 4 * S[i/ 2 ] + 1 ;
}
return S[n];
}
static void moserDeBruijn( int n)
{
for ( int i = 0 ; i < n; i++)
System.out.print(gen(i)+ " " );
}
public static void main(String[] args)
{
int n = 15 ;
System.out.println( "First " + n +
" terms of " +
"Moser-de Bruijn Sequence : " );
moserDeBruijn(n);
}
}
|
Python3
def gen( n ):
S = [ 0 , 1 ]
for i in range ( 2 , n + 1 ):
if i % 2 = = 0 :
S.append( 4 * S[ int (i / 2 )]);
else :
S.append( 4 * S[ int (i / 2 )] + 1 );
z = S[n];
return z;
def moserDeBruijn(n):
for i in range (n):
print (gen(i), end = " " )
n = 15
print ( "First" , n, "terms of " ,
"Moser-de Brujn Sequence:" )
moserDeBruijn(n)
|
C#
using System;
class GFG
{
static int gen( int n)
{
int []S = new int [n + 1];
S[0] = 0;
if (n != 0)
S[1] = 1;
for ( int i = 2; i <= n; i++)
{
if (i % 2 == 0)
S[i] = 4 * S[i / 2];
else
S[i] = 4 * S[i/2] + 1;
}
return S[n];
}
static void moserDeBruijn( int n)
{
for ( int i = 0; i < n; i++)
Console.Write(gen(i)+ " " );
}
public static void Main()
{
int n = 15;
Console.WriteLine( "First " + n +
" terms of " +
"Moser-de Bruijn Sequence : " );
moserDeBruijn(n);
}
}
|
PHP
<?php
function gen( $n )
{
$S = array ();
$S [0] = 0;
$S [1] = 1;
for ( $i = 2; $i <= $n ; $i ++)
{
if ( $i % 2 == 0)
$S [ $i ] = 4 * $S [ $i / 2];
else
$S [ $i ] = 4 * $S [ $i /2] + 1;
}
return $S [ $n ];
}
function moserDeBruijn( $n )
{
for ( $i = 0; $i < $n ; $i ++)
echo gen( $i ) , " " ;
echo "\n" ;
}
$n = 15;
echo "First " , $n , " terms of "
, "Moser-de Bruijn Sequence : \n" ;
moserDeBruijn( $n );
?>
|
Javascript
<script>
function gen(n)
{
let S = new Array(n + 1);
S.fill(0);
S[0] = 0;
if (n != 0)
S[1] = 1;
for (let i = 2; i <= n; i++)
{
if (i % 2 == 0)
S[i] = 4 * S[parseInt(i / 2, 10)];
else
S[i] = 4 * S[parseInt(i / 2, 10)] + 1;
}
return S[n];
}
function moserDeBruijn(n)
{
for (let i = 0; i < n; i++)
document.write(gen(i)+ " " );
}
let n = 15;
document.write( "First " + n +
" terms of " +
"Moser-de Bruijn Sequence : " + "</br>" );
moserDeBruijn(n);
</script>
|
Output :
First 15 terms of Moser-de Bruijn Sequence :
0 1 4 5 16 17 20 21 64 65 68 69 80 81 84
Time complexity: O(n) since using a for loop
Auxiliary Space: O(n) for array
Last Updated :
23 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...