কম্পিউটার টিউটোরিয়াল

জাভা প্রোগ্রাম: ফাংশন ব্যবহার করে ইন্টারভালের মধ্যে প্রাইম নাম্বার বের করা

প্রাইম নাম্বার বের করা (রেঞ্জে)

দুটি সংখ্যার মাঝপথে থাকা সব প্রাইম নাম্বার বের করা। একটি হেল্পার ফাংশন IsPrime() ব্যবহার করে প্রতিটি সংখ্যা চেক করা হয়।

ইনপুট ও আউটপুট উদাহরণ

ইনপুট:

Starting number : 1
Ending number : 75

আউটপুট:

The prime numbers between the interval 1 and 75 are:
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73

অ্যালগরিদম

  1. প্রোগ্রাম শুরু করুন
  2. দুটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_high, my_low
  3. ব্যবহারকারী থেকে স্টার্টিং এবং এন্ডিং নম্বর ইনপুট নিন
  4. IsPrime(n) ফাংশন ডিফাইন করুন যা বুলিয়ান রিটার্ন করে
  5. হোয়াইল লুপে my_low থেকে my_high পর্যন্ত ইটারেট করুন
  6. প্রতিটি সংখ্যার জন্য IsPrime কল করুন, true হলে প্রিন্ট করুন
  7. প্রোগ্রাম শেষ করুন

উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া

import java.util.Scanner;

public class PrimeNumber {
    public static void main(String[] args) {
        int my_high, my_low;
        System.out.println("Required packages have been imported");
        Scanner my_scanner = new Scanner(System.in);
        System.out.println("A reader object has been defined");
        System.out.print("Enter the starting number : ");
        my_low = my_scanner.nextInt();
        System.out.print("Enter an ending Number: ");
        my_high = my_scanner.nextInt();
        
        System.out.println("The prime numbers between the interval " + my_low + " and " + my_high + " are:");
        while (my_low < my_high) {
            if (IsPrime(my_low))
                System.out.print(my_low + " ");
            ++my_low;
        }
    }
    
    public static boolean IsPrime(int my_input) {
        boolean flag = true;
        for (int i = 2; i <= my_input / 2; ++i) {
            if (my_input % i == 0) {
                flag = false;
                break;
            }
        }
        return flag;
    }
}

উদাহরণ ২: পূর্বনির্ধারিত মান ব্যবহার

public class PrimeNumber {
    public static void main(String[] args) {
        int my_high = 75, my_low = 1;
        System.out.println("The starting and ending numbers are defined as " + my_low + " and " + my_high);
        System.out.println("The prime numbers between the interval " + my_low + " and " + my_high + " are:");
        
        while (my_low < my_high) {
            if (IsPrime(my_low))
                System.out.print(my_low + " ");
            ++my_low;
        }
    }
    
    public static boolean IsPrime(int my_input) {
        boolean flag = true;
        for (int i = 2; i <= my_input / 2; ++i) {
            if (my_input % i == 0) {
                flag = false;
                break;
            }
        }
        return flag;
    }
}

দ্রষ্টব্য: ১ প্রাইম নয়!

আউটপুটে ১ দেখানো হয়েছে কিন্তু **১ প্রাইম নাম্বার নয়** (প্রাইমের সংজ্ঞা: ১-এর চেয়ে বড় এবং শুধু ১ ও নিজের ভাজক)। IsPrime(1) ফাংশনটি true রিটার্ন করে কারণ লুপ ২ থেকে শুরু হয় (2 <= 1/2 মিথ্যা)। এটি বাগ।

সঠিক IsPrime ফাংশন

public static boolean isPrimeCorrect(int n) {
    if (n <= 1) return false;        // ১ এবং नेগেটিভ প্রাইম নয়
    if (n <= 3) return true;         // ২, ৩ প্রাইম
    if (n % 2 == 0 || n % 3 == 0) return false; // ২, ৩ দিয়ে বিভাজ্য
    
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
    }
    return true;
}

সিভ অফ এরাটোস্থেনিস (Sieve of Eratosthenes) - সবচেয়ে দ্রুত

রেঞ্জে প্রাইম বের করার সেরা পদ্ধতি (O(N log log N)):

public static void printPrimesInRange(int low, int high) {
    boolean[] isPrime = new boolean[high + 1];
    Arrays.fill(isPrime, true);
    isPrime[0] = isPrime[1] = false;
    
    for (int i = 2; i * i <= high; i++) {
        if (isPrime[i]) {
            for (int j = i * i; j <= high; j += i)
                isPrime[j] = false;
        }
    }
    
    for (int i = Math.max(2, low); i <= high; i++) {
        if (isPrime[i]) System.out.print(i + " ");
    }
}

Segmented Sieve (বড় রেঞ্জের জন্য, মেমোরি সেভিং)

public static void segmentedSieve(long low, long high) {
    int limit = (int) Math.sqrt(high) + 1;
    boolean[] prime = new boolean[limit + 1];
    Arrays.fill(prime, true);
    prime[0] = prime[1] = false;
    for (int i = 2; i * i <= limit; i++)
        if (prime[i])
            for (int j = i * i; j <= limit; j += i)
                prime[j] = false;
    
    List primes = new ArrayList<>();
    for (int i = 2; i <= limit; i++) if (prime[i]) primes.add(i);
    
    boolean[] segment = new boolean[(int)(high - low + 1)];
    Arrays.fill(segment, true);
    
    for (int p : primes) {
        long start = Math.max((long)p * p, ((low + p - 1) / p) * p);
        for (long j = start; j <= high; j += p)
            segment[(int)(j - low)] = false;
    }
    
    for (int i = 0; i < segment.length; i++)
        if (segment[i] && (low + i) > 1)
            System.out.print((low + i) + " ");
}

Java Stream API (ফাংশনাল স্টাইল)

IntStream.rangeClosed(low, high)
    .filter(PrimeNumber::isPrimeCorrect)
    .forEach(n -> System.out.print(n + " "));

তুলনা

পদ্ধতিসময় জটিলতাস্পেসসেরা কিসের জন্য
IsPrime per numberO((H-L)√H)O(1)ছোট রেঞ্জ, কম কোয়েরি
Sieve of EratosthenesO(H log log H)O(H)মিডিয়াম রেঞ্জ (১০⁷ পর্যন্ত)
Segmented SieveO(H log log H)O(√H)বড় রেঞ্জ (১০¹²+)

বাস্তব প্রয়োগ

  • ক্রিপ্টোগ্রাফি (প্রাইম কি জেনারেশন)
  • হ্যাশ টেবিল সাইজ (প্রাইম সাইজ কলিশন কমায়)
  • র‍্যান্ডম নম্বর জেনারেটর
  • কম্পিটিটিভ প্রোগ্রামিং
  1. ফর লুপ ব্যবহার করে ১ থেকে N পর্যন্ত প্রাইম নম্বর প্রিন্ট করার সি প্রোগ্রাম

  2. জাভা প্রোগ্রাম: লুপ ব্যবহার করে অ্যালফাবেট (A থেকে Z) প্রদর্শন

  3. জাভা প্রোগ্রাম: ১ থেকে N পর্যন্ত সব প্রাইম নম্বর প্রদর্শন

  4. একটি সংখ্যার ইউনিক প্রাইম ফ্যাক্টরের গুণফল বের করার জাভা প্রোগ্রাম