Find minimum number of Log value needed to calculate Log upto N
Given an integer N. The task is to find the minimum number of log values needed to calculate all the log values from 1 to N using properties of the logarithm.
Examples:
Input : N = 6
Output : 3
Value of log1 is already know, i.e. 0.
Except this the three log values needed are,
log2, log3, log5.
Input : N = 4
Output : 2
One of the properties of log function is:
log(x.y) = log(x) + log(y)
Hence, to calculate log(x.y), we must know log values of x and y. Let us understand the concept using an example, for N = 6. Let ans denotes the number of log values needed to find all log values from 1 to 6.
- log(1)=0 (implicit).
- To calculate log(2), we must know its value prior, we can’t find this using property.so, ans become 1.
- To calculate log(3), we must know its value prior, we can’t find this using property.so, ans become 2.
- To calculate log(4), we can use property, log(4)=log(2.2)=log(2)+log(2).As we already find log(2) hence ans remains 2.
- To calculate log(5), we must know its value prior, we can’t find this using property.so, ans become 3.
- To calculate log(6), we can use property, log(6)=log(2.3)=log(2)+log(3).As we already find log(2) and log(3), hence ans remains 3.
The idea is very simple, on observing carefully you will find that you can’t calculate log values of prime number as it has no divisor(other than 1 and itself). So, the task reduces to find all prime numbers from 1 to N.
Algorithm :
Step 1: start
Step 2: Initialize a variable int MAX with the value 1000005.
Step 3: Create a vector name prime of the length MAX.
Step 4: Now make a function that stores the true value at all index in prime with the help of for loop.
Step 5: Now create another function that takes an integer value as input and then stores false at index 0 and 1 because 0 & 1 are not prime numbers.
Now Check if prime[i] is true by using a for loop that goes from 2 to N.Prime[ij] should be set to false for every j if prime[i] is true since ij is not a prime. If prime[i] is true, use another for loop that goes from 2 to N/i.
Step 6: Make another function countLogNeeded which takes an integer value as a parameter in the function initialize count to 0 and then call the above function which we created to find prime numbers.
Now run a for loop that counts all the prime numbers from 1 to N then return count.
Step 7: End
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000005
vector< bool > prime(MAX, true );
void sieve( int N)
{
prime[0] = prime[1] = false ;
for ( int i = 2; i <= N; i++) {
if (prime[i]) {
for ( int j = 2; i * j <= N; j++)
prime[i * j] = false ;
}
}
}
int countLogNeeded( int N)
{
int count = 0;
sieve(N);
for ( int i = 1; i <= N; i++) {
if (prime[i])
count++;
}
return count;
}
int main()
{
int N = 6;
cout<<countLogNeeded(N)<<endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int MAX = 1000005 ;
static Vector<Boolean> prime = new Vector<>(MAX);
static void vecIni()
{
for ( int i = 0 ; i < MAX; i++)
{
prime.add(i, true );
}
}
static void sieve( int N)
{
prime.add( 0 , false );
prime.add( 1 , false );
for ( int i = 2 ; i <= N; i++)
{
if (prime.get(i))
{
for ( int j = 2 ; i * j <= N; j++)
{
prime.add(i * j, false );
}
}
}
}
static int countLogNeeded( int N)
{
int count = 0 ;
sieve(N);
for ( int i = 1 ; i <= N; i++)
{
if (prime.get(i))
{
count++;
}
}
return count;
}
public static void main(String[] args)
{
vecIni();
int N = 6 ;
System.out.println(countLogNeeded(N));
}
}
|
Python3
MAX = 1000005
prime = [ True for i in range ( MAX )]
def sieve(N):
prime[ 0 ], prime[ 1 ] = False , False
for i in range ( 2 , N + 1 ):
if (prime[i]):
for j in range ( 2 , N + 1 ):
if (i * j > N):
break
prime[i * j] = False
def countLogNeeded(N):
count = 0
sieve(N)
for i in range ( 1 , N + 1 ):
if (prime[i]):
count = count + 1
return count
if __name__ = = '__main__' :
N = 6
print (countLogNeeded(N))
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
class GFG
{
static int MAX = 1000005;
static List<Boolean> prime = new List<Boolean>(MAX);
static void vecIni()
{
for ( int i = 0; i < MAX; i++)
{
prime.Add( true );
}
}
static void sieve( int N)
{
prime.Insert(0, false );
prime.Insert(1, false );
for ( int i = 2; i <= N; i++)
{
if (prime[i])
{
for ( int j = 2; i * j <= N; j++)
{
prime.Insert(i * j, false );
}
}
}
}
static int countLogNeeded( int N)
{
int count = 0;
sieve(N);
for ( int i = 1; i <= N; i++)
{
if (prime[i])
{
count++;
}
}
return count;
}
public static void Main()
{
vecIni();
int N = 6;
Console.Write(countLogNeeded(N));
}
}
|
Javascript
<script>
MAX = 1000005
var prime = Array(MAX).fill( true );
function sieve(N)
{
prime[0] = prime[1] = false ;
for ( var i = 2; i <= N; i++) {
if (prime[i]) {
for ( var j = 2; i * j <= N; j++)
prime[i * j] = false ;
}
}
}
function countLogNeeded(N)
{
var count = 0;
sieve(N);
for ( var i = 1; i <= N; i++) {
if (prime[i])
count++;
}
return count;
}
var N = 6;
document.write( countLogNeeded(N));
</script>
|
Time Complexity:
Auxiliary Space: O(N)
Last Updated :
25 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...