Find out the prime numbers in the form of A+nB or B+nA

Given two integers A and B and an integer N. The task is to find out N prime numbers of the form A + nB or B + nA( n=1, 2, 3…). If it is not possible, print -1.

Examples:

Input: A = 3, B = 5, N = 4
Output: 13, 11, 17, 23
Explanation:
13 (3+2*5)
11 (5+2*3)
17 (5+4*3)
23 (3+4*5)



Input: A = 4, B = 6, N = 4
Output: -1

Approach:
Since A + nB to be a prime one thing is sure that there should not present any common factor between A and B, means A and B should be co-prime.

The best and most efficient approach will be to use Dirichlet’s Theorem.

Dirichlet’s Theorem says that if a and b are relatively prime positive integers, then the arithmetic sequence a, a+b, a+2b, a+3b…contains infinitely many primes.

So firstly check if A and B are co-prime.
If A and B are co-prime then check A+nB and B+nA for their primality where n=1, 2, 3…. Print the first N prime numbers among them.
Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of
// the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Utility function to check
// whether two numbers is
// co-prime or not
int coprime(int a, int b)
{
    if (__gcd(a, b) == 1)
        return true;
    else
        return false;
}
  
// Utility function to check
// whether a number is prime
// or not
bool isPrime(int n)
{
    // Corner case
    if (n <= 1)
        return false;
  
    if (n == 2 or n == 3)
        return true;
  
    // Check from 2 to sqrt(n)
    for (int i = 2; i * i <= n; i++)
        if (n % i == 0)
            return false;
  
    return true;
}
  
// finding the Prime numbers
void findNumbers(int a, int b, int n)
{
  
    bool possible = true;
  
    // Checking whether given
    // numbers are co-prime
    // or not
    if (!coprime(a, b))
        possible = false;
  
    int c1 = 1;
    int c2 = 1;
  
    int num1, num2;
  
    // To store the N primes
    set<int> st;
    // If 'possible' is true
    if (possible) {
  
        // Printing n numbers
        // of prime
        while ((int)st.size() != n) {
  
            // checking the form of a+nb
            num1 = a + (c1 * b);
            if (isPrime(num1)) {
                st.insert(num1);
            }
            c1++;
  
            // Checking the form of b+na
            num2 = b + (c2 * a);
            if (isPrime(num2)) {
                st.insert(num2);
            }
            c2++;
        }
  
        for (int i : st)
            cout << i << " ";
    }
  
    // If 'possible' is false
    // return -1
    else
        cout << "-1";
}
  
// Driver Code
int main()
{
  
    int a = 3;
    int b = 5;
    int n = 4;
  
    findNumbers(a, b, n);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.util.*;
class GFG
{
static int __gcd(int a, int b) 
    if (b == 0
        return a; 
    return __gcd(b, a % b); 
}
  
// Utility function to check
// whether two numbers is
// co-prime or not
static boolean coprime(int a, int b)
{
    if (__gcd(a, b) == 1)
        return true;
    else
        return false;
}
  
// Utility function to check
// whether a number is prime
// or not
static boolean isPrime(int n)
{
    // Corner case
    if (n <= 1)
        return false;
  
    if (n == 2 || n == 3)
        return true;
  
    // Check from 2 to sqrt(n)
    for (int i = 2; i * i <= n; i++)
        if (n % i == 0)
            return false;
  
    return true;
}
  
// finding the Prime numbers
static void findNumbers(int a, int b, int n)
{
    boolean possible = true;
  
    // Checking whether given
    // numbers are co-prime
    // or not
    if (!coprime(a, b))
        possible = false;
  
    int c1 = 1;
    int c2 = 1;
  
    int num1, num2;
  
    // To store the N primes
    HashSet<Integer> st = new HashSet<Integer>();
    // If 'possible' is true
    if (possible)
    {
  
        // Printing n numbers
        // of prime
        while ((int)st.size() != n)
        {
  
            // checking the form of a+nb
            num1 = a + (c1 * b);
            if (isPrime(num1))
            {
                st.add(num1);
            }
            c1++;
  
            // Checking the form of b+na
            num2 = b + (c2 * a);
            if (isPrime(num2)) 
            {
                st.add(num2);
            }
            c2++;
        }
  
        for (int i : st)
            System.out.print(i + " ");
    }
  
    // If 'possible' is false
    // return -1
    else
        System.out.print("-1");
}
  
// Driver Code
public static void main(String[] args) 
{
    int a = 3;
    int b = 5;
    int n = 4;
  
    findNumbers(a, b, n);
}
}
  
// This code is contributed by Rajput-Ji

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the above approach 
from math import gcd, sqrt
  
# Utility function to check 
# whether two numbers is 
# co-prime or not 
def coprime(a, b) :
      
    if (gcd(a, b) == 1) :
        return True
          
    else :
        return False
  
# Utility function to check 
# whether a number is prime 
# or not 
def isPrime(n) : 
  
    # Corner case 
    if (n <= 1) :
        return False
  
    if (n == 2 or n == 3) :
        return True
  
    # Check from 2 to sqrt(n) 
    for i in range(2, int(sqrt(n)) + 1) :
        if (n % i == 0) :
            return False
  
    return True
  
# finding the Prime numbers 
def findNumbers(a, b, n) :
  
    possible = True
  
    # Checking whether given 
    # numbers are co-prime 
    # or not 
    if (not coprime(a, b)) :
        possible = False
  
    c1 = 1
    c2 = 1
  
    num1 = 0;
    num2 = 0
  
    # To store the N primes 
    st = set(); 
      
    # If 'possible' is true 
    if (possible) :
  
        # Printing n numbers 
        # of prime 
        while (len(st) != n) :
  
            # checking the form of a+nb 
            num1 = a + (c1 * b); 
              
            if (isPrime(num1)):
                  
                st.add(num1); 
                  
            c1 += 1
  
            # Checking the form of b+na 
            num2 = b + (c2 * a); 
              
            if (isPrime(num2)):
                st.add(num2); 
      
            c2 += 1
  
        for i in st :
            print(i, end = " "); 
  
    # If 'possible' is false 
    # return -1 
    else :
        print("-1"); 
  
# Driver Code 
if __name__ == "__main__"
  
    a = 3
    b = 5
    n = 4
  
    findNumbers(a, b, n); 
  
# This code is contributed by AnkitRai01

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
using System.Collections.Generic;
  
class GFG
{
static int __gcd(int a, int b) 
    if (b == 0) 
        return a; 
    return __gcd(b, a % b); 
}
  
// Utility function to check
// whether two numbers is
// co-prime or not
static bool coprime(int a, int b)
{
    if (__gcd(a, b) == 1)
        return true;
    else
        return false;
}
  
// Utility function to check
// whether a number is prime
// or not
static bool isPrime(int n)
{
    // Corner case
    if (n <= 1)
        return false;
  
    if (n == 2 || n == 3)
        return true;
  
    // Check from 2 to sqrt(n)
    for (int i = 2; i * i <= n; i++)
        if (n % i == 0)
            return false;
  
    return true;
}
  
// finding the Prime numbers
static void findNumbers(int a, int b, int n)
{
    bool possible = true;
  
    // Checking whether given
    // numbers are co-prime
    // or not
    if (!coprime(a, b))
        possible = false;
  
    int c1 = 1;
    int c2 = 1;
  
    int num1, num2;
  
    // To store the N primes
    HashSet<int> st = new HashSet<int>();
      
    // If 'possible' is true
    if (possible)
    {
  
        // Printing n numbers
        // of prime
        while (st.Count != n)
        {
  
            // checking the form of a+nb
            num1 = a + (c1 * b);
            if (isPrime(num1))
            {
                st.Add(num1);
            }
            c1++;
  
            // Checking the form of b+na
            num2 = b + (c2 * a);
            if (isPrime(num2)) 
            {
                st.Add(num2);
            }
            c2++;
        }
  
        foreach (int i in st)
            Console.Write(i + " ");
    }
  
    // If 'possible' is false
    // return -1
    else
        Console.Write("-1");
}
  
// Driver Code
public static void Main(String[] args) 
{
    int a = 3;
    int b = 5;
    int n = 4;
  
    findNumbers(a, b, n);
}
}
  
// This code is contributed by 29AjayKumar

chevron_right


Output:

11 13 17 23


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.