P – smooth numbers in given ranges

• Difficulty Level : Hard
• Last Updated : 01 Mar, 2018

Given multiple ranges [L, R] and a prime number p, we need to find all P-smooth numbers in given individual ranges.

What is P – smooth number?
An integer is P – smooth number if the largest Prime factor of that number <= p. 1 is considered (by OEIS) as P – smooth number for any possible value of P because it does not have any prime factor.

Examples:

Input : p = 7
ranges[] = {[1, 17],  [10, 25]}

Output :
For first range : 1 2 3 4 5 6 7 8 9 12 14 15 16
For second range : 15 16 18 20 21 24 25
Explanation : Largest prime factors of numbers
printed above are less than or equal to 7.

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Suppose, we are checking 7 – smooth numbers.
1. Consider an integer 56. Here, 56 = 2 * 2 * 2 * 7.
So, 56 has two prime factors (2 and 7) which are <=7. So, 56 is 7-smooth number.
2. Consider another integer 66. Here, 66 = 2 * 3 * 11.
66 has three prime factors (2, 3 and 11). Where 11>7. So 66 is not 7-smooth number.

Brute – Force Approach: Let P and range [L, R] is given. Here L <= R. Create a loop and check for all numbers in inclusive range [L : R]. If that number has largest prime factor <= p. Then print that number (i.e. P-smooth number). Calculate its Largest Prime Factor / Divisor, using maxPrimeDivisor(n) function.

Efficient Approach: The idea is to pre-compute p-smooth numbers for maximum value of all ranges. Once we have pre-computed, we can quickly print for all ranges one by one.

 # Python program to display p-smooth # number in given range.# P-smooth numbers' arrayp_smooth =    def maxPrimeDivisor(n):          # Returns Maximum Prime     # Divisor of n    MPD = -1          if n == 1 :         return 1          while n % 2 == 0:        MPD = 2        n = n // 2          # math.sqrt(n) + 1    size = int(n ** 0.5) + 1    for odd in range( 3, size, 2 ):        while n % odd == 0:                          # Make sure no multiples             # of prime, enters here            MPD = odd            n = n // odd          # When n is prime itself    MPD = max (n, MPD)           return MPD     def generate_p_smooth(p, MAX_LIMIT):              # generates p-smooth numbers.    global p_smooth          for i in range(2, MAX_LIMIT + 1):        if maxPrimeDivisor(i) <= p:                          # Satisfies the condition             # of p-smooth number            p_smooth.append(i)    def find_p_smooth(L, R):          # finds p-smooth number in the    # given [L:R] range.    global p_smooth    if L <= p_smooth[-1]:                  # If user input exceeds MAX_LIMIT        # range, no checking        for w in p_smooth :            if w > R : break            if w >= L and w <= R :                                  # Print P-smooth numbers                 # within range : L to R.                print(w, end =" ")                          print()          # p_smooth number : p = 7# L <= Rp = 7L, R = 1, 100  # Maximum possible value of RMAX_LIMIT = 1000  # generate the p-smooth numbersgenerate_p_smooth(p, MAX_LIMIT)   # Find an print the p-smooth numbersfind_p_smooth(L, R)

My Personal Notes arrow_drop_up