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