Skip to content

Commit 89ffdeb

Browse files
committed
Segmented sieve problem added
1 parent 5246f63 commit 89ffdeb

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.thealgorithms.maths;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
public class SegmentedSieve {
8+
9+
// fillPrime function fills primes from 2 to sqrt of high in chprime ArrayList
10+
public static void fillPrime(ArrayList<Integer> chprime, int high) {
11+
boolean[] ck = new boolean[high + 1];
12+
Arrays.fill(ck, true);
13+
ck[1] = false;
14+
ck[0] = false;
15+
16+
for (int i = 2; (i * i) <= high; i++) {
17+
if (ck[i]) {
18+
for (int j = i * i; j <= Math.sqrt(high); j = j + i) {
19+
ck[j] = false;
20+
}
21+
}
22+
}
23+
for (int i = 2; i * i <= high; i++) {
24+
if (ck[i]) {
25+
chprime.add(i);
26+
}
27+
}
28+
}
29+
30+
// in segmented sieve we check for prime from range [low, high]
31+
public static List<Integer> segmentedSieve(int low, int high) {
32+
if (low > high || low < 2) {
33+
throw new IllegalArgumentException("Invalid range");
34+
}
35+
36+
ArrayList<Integer> chprime = new ArrayList<>();
37+
fillPrime(chprime, high);
38+
39+
boolean[] prime = new boolean[high - low + 1];
40+
Arrays.fill(prime, true);
41+
42+
for (int i : chprime) {
43+
int lower = (low / i);
44+
if (lower <= 1) {
45+
lower = i + i;
46+
} else if (low % i != 0) {
47+
lower = (lower * i) + i;
48+
} else {
49+
lower = (lower * i);
50+
}
51+
for (int j = lower; j <= high; j = j + i) {
52+
prime[j - low] = false;
53+
}
54+
}
55+
56+
List<Integer> result = new ArrayList<>();
57+
for (int i = low; i <= high; i++) {
58+
if (prime[i - low]) {
59+
result.add(i);
60+
}
61+
}
62+
63+
return result;
64+
}
65+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.thealgorithms.maths;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class SegmentedSieveTest {
10+
11+
@Test
12+
public void testPrimesInRange() {
13+
List<Integer> expectedPrimes = List.of(2, 3, 5, 7);
14+
assertEquals(expectedPrimes, SegmentedSieve.segmentedSieve(2, 10));
15+
16+
List<Integer> expectedPrimes2 = List.of(11, 13, 17, 19);
17+
assertEquals(expectedPrimes2, SegmentedSieve.segmentedSieve(10, 20));
18+
}
19+
20+
@Test
21+
public void testLargeRange() {
22+
List<Integer> expectedPrimes = List.of(99991, 99997);
23+
assertEquals(expectedPrimes, SegmentedSieve.segmentedSieve(99990, 100000));
24+
}
25+
26+
@Test
27+
public void testSinglePrime() {
28+
List<Integer> expectedPrime = List.of(7);
29+
assertEquals(expectedPrime, SegmentedSieve.segmentedSieve(7, 7));
30+
31+
List<Integer> expectedEmpty = new ArrayList<>();
32+
assertEquals(expectedEmpty, SegmentedSieve.segmentedSieve(8, 8));
33+
}
34+
35+
@Test
36+
public void testInvalidRange() {
37+
assertThrows(IllegalArgumentException.class, () -> SegmentedSieve.segmentedSieve(-10, 10));
38+
assertThrows(IllegalArgumentException.class, () -> SegmentedSieve.segmentedSieve(20, 10)); // Invalid range
39+
}
40+
}

0 commit comments

Comments
 (0)