Labor 4: Sieb für Primzahlen

Werbung
MAS Embedded Software HS12
Prof. Dr. Carlo Nicola
Labor 4: Sieb für Primzahlen
Ziel
In dieser Übung werden Sie lernen, wie man einen nicht ganz trivialen Algorithmus zuerst in
Java und dann als Android-Applikation entwirft. Der gewählte Algorithmus zählt zu den
wichtigsten, die in der Praxis tagtäglich benutzt werden. Primzahlen sind nämlich wegen der
RSA-Verschlüsselung das Arbeitstier der Finanzwelt..
Aufgabe
Aus Wikipedia (http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes) :
„Zunächst werden alle Zahlen 2, 3, 4,… bis zu einem frei wählbaren Maximalwert S
aufgeschrieben. Die zunächst unmarkierten Zahlen sind potentielle Primzahlen. Die kleinste
unmarkierte Zahl ist immer eine Primzahl. Nachdem eine Primzahl gefunden wurde, werden
alle Vielfachen dieser Primzahl als zusammengesetzt markiert. Es genügt dabei, mit dem
Quadrat der Primzahl zu beginnen, da alle kleineren Vielfachen bereits markiert sind. Sobald
das Quadrat der Primzahl größer als die Schranke S ist, sind alle Primzahlen kleiner oder
gleich S bestimmt: Es sind die nicht markierten Zahlen.
Das Verfahren beginnt also damit, die Vielfachen 4, 6, 8,… der kleinsten Primzahl 2
durchzustreichen. Die nächste unmarkierte Zahl ist die nächst grösserer Primzahl, die 3.
Anschließend werden deren Vielfache 9, 12, 15,… durchgestrichen, usw.“
Versuchen Sie den Algorithmus richtig mit einem Beispiel (N = 70) und nur Bleistift und
Papier! zu verstehen.
Versuchen sie dann den Algrithmus in Java zu implementieren.
Ein fast vollständiges Programm steht Ihnen zur Verfügung: Merken Sie aber, dass diese
Implementation die Primzahlen nicht auflistet. Ergänzen Sie das Programm, damit es nicht
nur die Anzahl der Primzahlen sondern auch die Primzahlen selber herausgibt.
1
MAS Embedded Software HS12
Prof. Dr. Carlo Nicola
public class PrimeSieve {
public static void main(String[] args) {
BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in));
int N = 0;
String str = null;
System.out.print("Enter a natural number: ");
try {
str = rdr.readLine();
} catch (IOException e1) {
System.out.println("I/O exception");
}
try {
N = Integer.parseInt(str);
} catch (NumberFormatException e) {
System.out.println("Please enter an integer value");
}
System.out.println("Running (N = " + N + ")");
// initially assume all integers are prime
boolean[] isPrime = new boolean[N + 1];
for (int i = 2; i <= N; i++) {
isPrime[i] = true;
}
// mark non-primes <= N using Sieve of Eratosthenes
for (int i = 2; i * i <= N; i++) {
// if i is prime, then mark multiples of i as non prime
// suffices to consider multiples i, i+1, ..., N/i
if (isPrime[i]) {
for (int j = i; i * j <= N; j++) {
isPrime[i * j] = false;
}
}
}
// count primes
int primes = 0;
for (int i = 2; i <= N; i++) {
if (isPrime[i])
primes++;
}
System.out.println("The number of primes <= " + N + " is " + primes);
}
}
.
Portierung des Sieb-Programmes auf Android.
2
MAS Embedded Software HS12
Prof. Dr. Carlo Nicola
Vorgehen
Das UI des Programms sieht wie folgt aus:
Das Layout-File main.xml sieht, wie folgt aus:
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Integer Range:" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/EditTextN" />
</LinearLayout>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
android:id="@+id/ButtonStart" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/TextViewRes" />
</LinearLayout>
Und das AndroidManifest.xml sieht, wie folgt aus:
3
MAS Embedded Software HS12
Prof. Dr. Carlo Nicola
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ibneco.android.sieve"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".AndroSimpleSieve"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
Nun sollen Sie das Sieb-Programm in einer Activity verpacken und über die Methode
onCreate() starten.
Schwierigere Aufgabe:
1. Versuchen Sie die Java Version mit möglichst vielen Threads zu implementieren;
2. Das gleiche auch für die Android-Portierung.
4
Herunterladen