প্রাইম নাম্বার বের করা (রেঞ্জে)
দুটি সংখ্যার মাঝপথে থাকা সব প্রাইম নাম্বার বের করা। একটি হেল্পার ফাংশন 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
অ্যালগরিদম
- প্রোগ্রাম শুরু করুন
- দুটি ইন্টিজার ভেরিয়েবল ঘোষণা করুন: my_high, my_low
- ব্যবহারকারী থেকে স্টার্টিং এবং এন্ডিং নম্বর ইনপুট নিন
- IsPrime(n) ফাংশন ডিফাইন করুন যা বুলিয়ান রিটার্ন করে
- হোয়াইল লুপে my_low থেকে my_high পর্যন্ত ইটারেট করুন
- প্রতিটি সংখ্যার জন্য IsPrime কল করুন, true হলে প্রিন্ট করুন
- প্রোগ্রাম শেষ করুন
উদাহরণ ১: ব্যবহারকারী ইনপুট নেওয়া
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 number | O((H-L)√H) | O(1) | ছোট রেঞ্জ, কম কোয়েরি |
| Sieve of Eratosthenes | O(H log log H) | O(H) | মিডিয়াম রেঞ্জ (১০⁷ পর্যন্ত) |
| Segmented Sieve | O(H log log H) | O(√H) | বড় রেঞ্জ (১০¹²+) |
বাস্তব প্রয়োগ
- ক্রিপ্টোগ্রাফি (প্রাইম কি জেনারেশন)
- হ্যাশ টেবিল সাইজ (প্রাইম সাইজ কলিশন কমায়)
- র্যান্ডম নম্বর জেনারেটর
- কম্পিটিটিভ প্রোগ্রামিং