Subtrees hinzugefügt
This commit is contained in:
parent
bf2cd02475
commit
cfa0ec9c0d
27 changed files with 965 additions and 0 deletions
6
Software/IuD_Schnelle_Potenzierung_BJ/.gitignore
vendored
Normal file
6
Software/IuD_Schnelle_Potenzierung_BJ/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
*.sh
|
||||||
|
*.class
|
||||||
|
*.ctxt
|
||||||
|
repo.adoc
|
||||||
|
repo_subtree.adoc
|
||||||
|
/alt
|
||||||
11
Software/IuD_Schnelle_Potenzierung_BJ/readme.adoc
Normal file
11
Software/IuD_Schnelle_Potenzierung_BJ/readme.adoc
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
= Material :
|
||||||
|
|
||||||
|
|===
|
||||||
|
|Zuordnung|
|
||||||
|
|Klassenstufe|
|
||||||
|
|Bildungsplanbezug |
|
||||||
|
|Werkzeug|
|
||||||
|
|Autoren|
|
||||||
|
|===
|
||||||
|
|
||||||
|
== Inhalt
|
||||||
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung-MIT-HILFEN/.gitignore
vendored
Normal file
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung-MIT-HILFEN/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
*.sh
|
||||||
|
*.class
|
||||||
|
*.ctxt
|
||||||
|
repo.adoc
|
||||||
|
repo_subtree.adoc
|
||||||
|
/alt
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Filtered on Sonntag 2022-März-13 at 23:15:06 by Tippfilter 0.4-4-g83a7d89 (development build)
|
||||||
|
|
||||||
|
/** Diese Klasse enthält eine Methode zur schnellen modularen Potenzierung,
|
||||||
|
* die bei RSA und anderen modernen Kryptoverfahren zum Einsatz kommt.
|
||||||
|
*
|
||||||
|
* Sie ist als Programmierübung für Oberstufenschüler gedacht. Dabei stehen
|
||||||
|
* die rekursive Implementierung und die modulo-Operation im Vordergrund.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @author Tobias Nopper
|
||||||
|
* @version 2021-03-24
|
||||||
|
* Dieses Projekt steht unter der Lizenz CC BY-NC-SA 4.0
|
||||||
|
* This project is licensed under CC BY-NC-SA 4.0
|
||||||
|
* (https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode) */
|
||||||
|
public class SchnellePotenzierung {
|
||||||
|
|
||||||
|
/** Berechnet die modulare Potenz a^b mod m.
|
||||||
|
* Der Modulo der Rest bei der Division; 16:6 = 2 Rest 4, also ist
|
||||||
|
* 16 mod 6 = 4.
|
||||||
|
* Java hat dafür den Operator "%"; "16%6" liefert also 4.
|
||||||
|
* @param a Basis der Potenzierung
|
||||||
|
* @param b Exponent der Potenzierung
|
||||||
|
* @param m Modul der Restklasse, in der gerechnet wird
|
||||||
|
* @return Das Ergebnis der Rechnung a^b mod m. */
|
||||||
|
public static int modPotenz(int a, int b, int m) {
|
||||||
|
// Tipp: Überlegen Sie, was bei der Potenzierung a^b der einfachste
|
||||||
|
// Fall ist (oder die einfachsten Fälle); die gleiche Überlegung gilt
|
||||||
|
// auch für a^b mod m.
|
||||||
|
// Überlegen Sie dann, wie Sie andere Fälle darauf reduzieren können.
|
||||||
|
/* Man kann für b >= 0 die folgenden Fälle unterscheiden:
|
||||||
|
*
|
||||||
|
* | 1 , falls b == 0
|
||||||
|
* | a , falls b == 1
|
||||||
|
* a^b mod m = | (a^(b-1))*a , falls b ungerade
|
||||||
|
* | (a^(b/2))^2 , sonst
|
||||||
|
*
|
||||||
|
* Analysieren Sie, ob Sie statt mit vier Fällen auch mit drei auskommen.
|
||||||
|
*
|
||||||
|
* Achtung: In der obigen Fallunterscheidung müssen die Zwischenergebnisse
|
||||||
|
* _aller_ Rechenoperationen jeweils modulo m verkleinert werden (das mod m
|
||||||
|
* ist der Übersicht wegen nur nicht aufgeschrieben). Weil Zwischenergebnisse
|
||||||
|
* sehr groß werden können, nimmt man für sie den Datentyp long.
|
||||||
|
*
|
||||||
|
* Auch den Test gerade/ungerade kann man mit Modulo realisieren. */
|
||||||
|
// Der Basisfall ist b=0, dann ist das Ergebnis 1:
|
||||||
|
// Das Zwischenergebnis kann größer sein, als int-Variablen
|
||||||
|
// aufnehmen können, deswegen nimmt man dafür den Datentyp long:
|
||||||
|
// o Wenn b gerade, also b%2==1, dann...
|
||||||
|
// - berechne a^(b-1) mod m (rekursiv) und speichere das Ergebnis
|
||||||
|
// - multipliziere einmal a "dazu":
|
||||||
|
// o sonst (wenn also b gerade), dann...
|
||||||
|
// - berechne a^(b/2) mod m (rekursiv!), merk dir das Ergebnis...
|
||||||
|
// - ... und quadriere es
|
||||||
|
// o verkleinere das Zwischenergebnis modulo m:
|
||||||
|
// o wandle es zurück nach int (woher wissen wir, dass es jetzt
|
||||||
|
// auf jeden Fall in einen int passt?) und gib es zurück:
|
||||||
|
return -12345; // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Filtered on Sonntag 2022-März-13 at 23:15:06 by Tippfilter 0.4-4-g83a7d89 (development build)
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/** Die Test-Klasse SchnellePotenzierungTest enthält Tests für die gleichnamige
|
||||||
|
* Klasse mit Programmierübungen.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @version 2021-04 */
|
||||||
|
public class SchnellePotenzierungTest {
|
||||||
|
/** Konstruktor fuer die Test-Klasse SchnellePotenzierungTest */
|
||||||
|
public SchnellePotenzierungTest() { }
|
||||||
|
|
||||||
|
/** Wird vor jeder Testfall-Methode aufgerufen. */
|
||||||
|
@Before
|
||||||
|
public void setUp() { }
|
||||||
|
|
||||||
|
/** Wird nach jeder Testfall-Methode aufgerufen. */
|
||||||
|
@After
|
||||||
|
public void tearDown() { }
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEinfacheFaelle() {
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(3, 0, 5));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(88, 0, 15));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(75345, 0, 15));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 1, 5));
|
||||||
|
assertEquals(2, SchnellePotenzierung.modPotenz(2, 1, 5));
|
||||||
|
assertEquals(3, SchnellePotenzierung.modPotenz(3, 1, 5));
|
||||||
|
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 44));
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 45));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 44));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 45));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSoMittel() {
|
||||||
|
assertEquals(49, SchnellePotenzierung.modPotenz(7, 2, 100));
|
||||||
|
assertEquals(69, SchnellePotenzierung.modPotenz(13, 2, 100));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(9, 2, 152));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(3, 4, 1000));
|
||||||
|
assertEquals(24, SchnellePotenzierung.modPotenz(2, 10, 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGrosseZahlen() {
|
||||||
|
assertEquals(80, SchnellePotenzierung.modPotenz(37, 513, 101));
|
||||||
|
assertEquals(129, SchnellePotenzierung.modPotenz(376, 53, 1001));
|
||||||
|
assertEquals(5192, SchnellePotenzierung.modPotenz(376, 5173, 12344));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
#BlueJ package file
|
||||||
|
dependency1.from=SchnellePotenzierungTest
|
||||||
|
dependency1.to=SchnellePotenzierung
|
||||||
|
dependency1.type=UsesDependency
|
||||||
|
editor.fx.0.height=1013
|
||||||
|
editor.fx.0.width=1034
|
||||||
|
editor.fx.0.x=2009
|
||||||
|
editor.fx.0.y=31
|
||||||
|
objectbench.height=95
|
||||||
|
objectbench.width=770
|
||||||
|
package.divider.horizontal=0.6
|
||||||
|
package.divider.vertical=0.7992125984251969
|
||||||
|
package.editor.height=399
|
||||||
|
package.editor.width=643
|
||||||
|
package.editor.x=1735
|
||||||
|
package.editor.y=68
|
||||||
|
package.frame.height=600
|
||||||
|
package.frame.width=800
|
||||||
|
package.numDependencies=1
|
||||||
|
package.numTargets=2
|
||||||
|
package.showExtends=true
|
||||||
|
package.showUses=true
|
||||||
|
project.charset=UTF-8
|
||||||
|
readme.height=60
|
||||||
|
readme.name=@README
|
||||||
|
readme.width=49
|
||||||
|
readme.x=10
|
||||||
|
readme.y=10
|
||||||
|
target1.height=70
|
||||||
|
target1.name=SchnellePotenzierungTest
|
||||||
|
target1.showInterface=false
|
||||||
|
target1.type=UnitTestTargetJunit4
|
||||||
|
target1.width=220
|
||||||
|
target1.x=120
|
||||||
|
target1.y=70
|
||||||
|
target2.height=70
|
||||||
|
target2.name=SchnellePotenzierung
|
||||||
|
target2.showInterface=false
|
||||||
|
target2.type=ClassTarget
|
||||||
|
target2.width=190
|
||||||
|
target2.x=10
|
||||||
|
target2.y=160
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
This folder was generated on 2022-03-13 23:15:06
|
||||||
|
by Tippfilter version: 0.4-4-g83a7d89 (development build), built Donnerstag 2022-02-24 at 15:07:14)
|
||||||
|
|
||||||
|
using the following configuration:
|
||||||
|
|
||||||
|
original folder: /home/urs/Schreibtisch/kr-skript/schnelle-potenzierung
|
||||||
|
destination folder: /home/urs/Schreibtisch/kr-skript/sschnelle-postenzierung-MIT-HILFEN
|
||||||
|
overwrite destination folder: true
|
||||||
|
config files (order parsed): /home/urs/Schreibtisch/kr-skript/schnelle-potenzierung/bluej.tippfilter
|
||||||
|
filtered patterns: [file://*.java]
|
||||||
|
ignored patterns: [dir://.git, file://.gitignore, file://*.tippfilter, dir://doc, file://*.ctxt, dir://bin, file://*.class]
|
||||||
|
requested sections: {file://package.bluej=UNKNOWN}
|
||||||
|
global default audience: HELP
|
||||||
|
all sections requested: true
|
||||||
|
audience for ALL sections: HELP
|
||||||
|
write log file: true
|
||||||
|
write filter date: true
|
||||||
|
|
||||||
|
and the sections: written for audience:
|
||||||
|
|
||||||
|
1 dir:/ | HELP |
|
||||||
|
2 file:/SchnellePotenzierung.java | HELP |
|
||||||
|
3 file:/package.bluej | HELP |
|
||||||
|
4 file:/SchnellePotenzierungTest.java | HELP |
|
||||||
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung-MIT-LOESUNG/.gitignore
vendored
Normal file
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung-MIT-LOESUNG/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
*.sh
|
||||||
|
*.class
|
||||||
|
*.ctxt
|
||||||
|
repo.adoc
|
||||||
|
repo_subtree.adoc
|
||||||
|
/alt
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
// Filtered on Sonntag 2022-März-13 at 23:14:46 by Tippfilter 0.4-4-g83a7d89 (development build)
|
||||||
|
|
||||||
|
/** Diese Klasse enthält eine Methode zur schnellen modularen Potenzierung,
|
||||||
|
* die bei RSA und anderen modernen Kryptoverfahren zum Einsatz kommt.
|
||||||
|
*
|
||||||
|
* Sie ist als Programmierübung für Oberstufenschüler gedacht. Dabei stehen
|
||||||
|
* die rekursive Implementierung und die modulo-Operation im Vordergrund.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @author Tobias Nopper
|
||||||
|
* @version 2021-03-24
|
||||||
|
* Dieses Projekt steht unter der Lizenz CC BY-NC-SA 4.0
|
||||||
|
* This project is licensed under CC BY-NC-SA 4.0
|
||||||
|
* (https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode) */
|
||||||
|
public class SchnellePotenzierung {
|
||||||
|
|
||||||
|
/** Berechnet die modulare Potenz a^b mod m.
|
||||||
|
* Der Modulo der Rest bei der Division; 16:6 = 2 Rest 4, also ist
|
||||||
|
* 16 mod 6 = 4.
|
||||||
|
* Java hat dafür den Operator "%"; "16%6" liefert also 4.
|
||||||
|
* @param a Basis der Potenzierung
|
||||||
|
* @param b Exponent der Potenzierung
|
||||||
|
* @param m Modul der Restklasse, in der gerechnet wird
|
||||||
|
* @return Das Ergebnis der Rechnung a^b mod m. */
|
||||||
|
public static int modPotenz(int a, int b, int m) {
|
||||||
|
// Tipp: Überlegen Sie, was bei der Potenzierung a^b der einfachste
|
||||||
|
// Fall ist (oder die einfachsten Fälle); die gleiche Überlegung gilt
|
||||||
|
// auch für a^b mod m.
|
||||||
|
// Überlegen Sie dann, wie Sie andere Fälle darauf reduzieren können.
|
||||||
|
/* Man kann für b >= 0 die folgenden Fälle unterscheiden:
|
||||||
|
*
|
||||||
|
* | 1 , falls b == 0
|
||||||
|
* | a , falls b == 1
|
||||||
|
* a^b mod m = | (a^(b-1))*a , falls b ungerade
|
||||||
|
* | (a^(b/2))^2 , sonst
|
||||||
|
*
|
||||||
|
* Analysieren Sie, ob Sie statt mit vier Fällen auch mit drei auskommen.
|
||||||
|
*
|
||||||
|
* Achtung: In der obigen Fallunterscheidung müssen die Zwischenergebnisse
|
||||||
|
* _aller_ Rechenoperationen jeweils modulo m verkleinert werden (das mod m
|
||||||
|
* ist der Übersicht wegen nur nicht aufgeschrieben). Weil Zwischenergebnisse
|
||||||
|
* sehr groß werden können, nimmt man für sie den Datentyp long.
|
||||||
|
*
|
||||||
|
* Auch den Test gerade/ungerade kann man mit Modulo realisieren. */
|
||||||
|
|
||||||
|
// Der Basisfall ist b=0, dann ist das Ergebnis 1:
|
||||||
|
if(b == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// Das Zwischenergebnis kann größer sein, als int-Variablen
|
||||||
|
// aufnehmen können, deswegen nimmt man dafür den Datentyp long:
|
||||||
|
long zwischenergebnis;
|
||||||
|
|
||||||
|
// o Wenn b gerade, also b%2==1, dann...
|
||||||
|
if(b % 2 == 1) {
|
||||||
|
// - berechne a^(b-1) mod m (rekursiv) und speichere das Ergebnis
|
||||||
|
zwischenergebnis = modPotenz(a, b - 1, m);
|
||||||
|
|
||||||
|
// - multipliziere einmal a "dazu":
|
||||||
|
zwischenergebnis = zwischenergebnis * a;
|
||||||
|
|
||||||
|
// o sonst (wenn also b gerade), dann...
|
||||||
|
} else {
|
||||||
|
// - berechne a^(b/2) mod m (rekursiv!), merk dir das Ergebnis...
|
||||||
|
zwischenergebnis = modPotenz(a, b/2, m);
|
||||||
|
|
||||||
|
// - ... und quadriere es
|
||||||
|
zwischenergebnis = zwischenergebnis * zwischenergebnis ;
|
||||||
|
}
|
||||||
|
// o verkleinere das Zwischenergebnis modulo m:
|
||||||
|
zwischenergebnis = zwischenergebnis % m;
|
||||||
|
|
||||||
|
// o wandle es zurück nach int (woher wissen wir, dass es jetzt
|
||||||
|
// auf jeden Fall in einen int passt?) und gib es zurück:
|
||||||
|
return (int) zwischenergebnis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Filtered on Sonntag 2022-März-13 at 23:14:46 by Tippfilter 0.4-4-g83a7d89 (development build)
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/** Die Test-Klasse SchnellePotenzierungTest enthält Tests für die gleichnamige
|
||||||
|
* Klasse mit Programmierübungen.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @version 2021-04 */
|
||||||
|
public class SchnellePotenzierungTest {
|
||||||
|
/** Konstruktor fuer die Test-Klasse SchnellePotenzierungTest */
|
||||||
|
public SchnellePotenzierungTest() { }
|
||||||
|
|
||||||
|
/** Wird vor jeder Testfall-Methode aufgerufen. */
|
||||||
|
@Before
|
||||||
|
public void setUp() { }
|
||||||
|
|
||||||
|
/** Wird nach jeder Testfall-Methode aufgerufen. */
|
||||||
|
@After
|
||||||
|
public void tearDown() { }
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEinfacheFaelle() {
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(3, 0, 5));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(88, 0, 15));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(75345, 0, 15));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 1, 5));
|
||||||
|
assertEquals(2, SchnellePotenzierung.modPotenz(2, 1, 5));
|
||||||
|
assertEquals(3, SchnellePotenzierung.modPotenz(3, 1, 5));
|
||||||
|
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 44));
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 45));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 44));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 45));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSoMittel() {
|
||||||
|
assertEquals(49, SchnellePotenzierung.modPotenz(7, 2, 100));
|
||||||
|
assertEquals(69, SchnellePotenzierung.modPotenz(13, 2, 100));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(9, 2, 152));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(3, 4, 1000));
|
||||||
|
assertEquals(24, SchnellePotenzierung.modPotenz(2, 10, 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGrosseZahlen() {
|
||||||
|
assertEquals(80, SchnellePotenzierung.modPotenz(37, 513, 101));
|
||||||
|
assertEquals(129, SchnellePotenzierung.modPotenz(376, 53, 1001));
|
||||||
|
assertEquals(5192, SchnellePotenzierung.modPotenz(376, 5173, 12344));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
#BlueJ package file
|
||||||
|
dependency1.from=SchnellePotenzierungTest
|
||||||
|
dependency1.to=SchnellePotenzierung
|
||||||
|
dependency1.type=UsesDependency
|
||||||
|
editor.fx.0.height=1013
|
||||||
|
editor.fx.0.width=1034
|
||||||
|
editor.fx.0.x=2009
|
||||||
|
editor.fx.0.y=31
|
||||||
|
objectbench.height=95
|
||||||
|
objectbench.width=770
|
||||||
|
package.divider.horizontal=0.6
|
||||||
|
package.divider.vertical=0.7992125984251969
|
||||||
|
package.editor.height=399
|
||||||
|
package.editor.width=643
|
||||||
|
package.editor.x=1735
|
||||||
|
package.editor.y=68
|
||||||
|
package.frame.height=600
|
||||||
|
package.frame.width=800
|
||||||
|
package.numDependencies=1
|
||||||
|
package.numTargets=2
|
||||||
|
package.showExtends=true
|
||||||
|
package.showUses=true
|
||||||
|
project.charset=UTF-8
|
||||||
|
readme.height=60
|
||||||
|
readme.name=@README
|
||||||
|
readme.width=49
|
||||||
|
readme.x=10
|
||||||
|
readme.y=10
|
||||||
|
target1.height=70
|
||||||
|
target1.name=SchnellePotenzierungTest
|
||||||
|
target1.showInterface=false
|
||||||
|
target1.type=UnitTestTargetJunit4
|
||||||
|
target1.width=220
|
||||||
|
target1.x=120
|
||||||
|
target1.y=70
|
||||||
|
target2.height=70
|
||||||
|
target2.name=SchnellePotenzierung
|
||||||
|
target2.showInterface=false
|
||||||
|
target2.type=ClassTarget
|
||||||
|
target2.width=190
|
||||||
|
target2.x=10
|
||||||
|
target2.y=160
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
This folder was generated on 2022-03-13 23:14:46
|
||||||
|
by Tippfilter version: 0.4-4-g83a7d89 (development build), built Donnerstag 2022-02-24 at 15:07:14)
|
||||||
|
|
||||||
|
using the following configuration:
|
||||||
|
|
||||||
|
original folder: /home/urs/Schreibtisch/kr-skript/schnelle-potenzierung
|
||||||
|
destination folder: /home/urs/Schreibtisch/kr-skript/sschnelle-potenzierung-MIT-LOESUNG
|
||||||
|
overwrite destination folder: true
|
||||||
|
config files (order parsed): /home/urs/Schreibtisch/kr-skript/schnelle-potenzierung/bluej.tippfilter
|
||||||
|
filtered patterns: [file://*.java]
|
||||||
|
ignored patterns: [dir://.git, file://.gitignore, file://*.tippfilter, dir://doc, file://*.ctxt, dir://bin, file://*.class]
|
||||||
|
requested sections: {file://package.bluej=UNKNOWN}
|
||||||
|
global default audience: SOLVED
|
||||||
|
all sections requested: true
|
||||||
|
audience for ALL sections: SOLVED
|
||||||
|
write log file: true
|
||||||
|
write filter date: true
|
||||||
|
|
||||||
|
and the sections: written for audience:
|
||||||
|
|
||||||
|
1 dir:/ | SOLVED |
|
||||||
|
2 file:/SchnellePotenzierung.java | SOLVED |
|
||||||
|
3 file:/package.bluej | SOLVED |
|
||||||
|
4 file:/SchnellePotenzierungTest.java | SOLVED |
|
||||||
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung-MIT-TIPPS/.gitignore
vendored
Normal file
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung-MIT-TIPPS/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
*.sh
|
||||||
|
*.class
|
||||||
|
*.ctxt
|
||||||
|
repo.adoc
|
||||||
|
repo_subtree.adoc
|
||||||
|
/alt
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
// Filtered on Sonntag 2022-März-13 at 23:15:38 by Tippfilter 0.4-4-g83a7d89 (development build)
|
||||||
|
|
||||||
|
/** Diese Klasse enthält eine Methode zur schnellen modularen Potenzierung,
|
||||||
|
* die bei RSA und anderen modernen Kryptoverfahren zum Einsatz kommt.
|
||||||
|
*
|
||||||
|
* Sie ist als Programmierübung für Oberstufenschüler gedacht. Dabei stehen
|
||||||
|
* die rekursive Implementierung und die modulo-Operation im Vordergrund.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @author Tobias Nopper
|
||||||
|
* @version 2021-03-24
|
||||||
|
* Dieses Projekt steht unter der Lizenz CC BY-NC-SA 4.0
|
||||||
|
* This project is licensed under CC BY-NC-SA 4.0
|
||||||
|
* (https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode) */
|
||||||
|
public class SchnellePotenzierung {
|
||||||
|
|
||||||
|
/** Berechnet die modulare Potenz a^b mod m.
|
||||||
|
* Der Modulo der Rest bei der Division; 16:6 = 2 Rest 4, also ist
|
||||||
|
* 16 mod 6 = 4.
|
||||||
|
* Java hat dafür den Operator "%"; "16%6" liefert also 4.
|
||||||
|
* @param a Basis der Potenzierung
|
||||||
|
* @param b Exponent der Potenzierung
|
||||||
|
* @param m Modul der Restklasse, in der gerechnet wird
|
||||||
|
* @return Das Ergebnis der Rechnung a^b mod m. */
|
||||||
|
public static int modPotenz(int a, int b, int m) {
|
||||||
|
// Tipp: Überlegen Sie, was bei der Potenzierung a^b der einfachste
|
||||||
|
// Fall ist (oder die einfachsten Fälle); die gleiche Überlegung gilt
|
||||||
|
// auch für a^b mod m.
|
||||||
|
// Überlegen Sie dann, wie Sie andere Fälle darauf reduzieren können.
|
||||||
|
// Das Zwischenergebnis kann größer sein, als int-Variablen
|
||||||
|
// aufnehmen können, deswegen nimmt man dafür den Datentyp long:
|
||||||
|
return -12345; // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Filtered on Sonntag 2022-März-13 at 23:15:39 by Tippfilter 0.4-4-g83a7d89 (development build)
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/** Die Test-Klasse SchnellePotenzierungTest enthält Tests für die gleichnamige
|
||||||
|
* Klasse mit Programmierübungen.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @version 2021-04 */
|
||||||
|
public class SchnellePotenzierungTest {
|
||||||
|
/** Konstruktor fuer die Test-Klasse SchnellePotenzierungTest */
|
||||||
|
public SchnellePotenzierungTest() { }
|
||||||
|
|
||||||
|
/** Wird vor jeder Testfall-Methode aufgerufen. */
|
||||||
|
@Before
|
||||||
|
public void setUp() { }
|
||||||
|
|
||||||
|
/** Wird nach jeder Testfall-Methode aufgerufen. */
|
||||||
|
@After
|
||||||
|
public void tearDown() { }
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEinfacheFaelle() {
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(3, 0, 5));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(88, 0, 15));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(75345, 0, 15));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 1, 5));
|
||||||
|
assertEquals(2, SchnellePotenzierung.modPotenz(2, 1, 5));
|
||||||
|
assertEquals(3, SchnellePotenzierung.modPotenz(3, 1, 5));
|
||||||
|
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 44));
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 45));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 44));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 45));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSoMittel() {
|
||||||
|
assertEquals(49, SchnellePotenzierung.modPotenz(7, 2, 100));
|
||||||
|
assertEquals(69, SchnellePotenzierung.modPotenz(13, 2, 100));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(9, 2, 152));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(3, 4, 1000));
|
||||||
|
assertEquals(24, SchnellePotenzierung.modPotenz(2, 10, 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGrosseZahlen() {
|
||||||
|
assertEquals(80, SchnellePotenzierung.modPotenz(37, 513, 101));
|
||||||
|
assertEquals(129, SchnellePotenzierung.modPotenz(376, 53, 1001));
|
||||||
|
assertEquals(5192, SchnellePotenzierung.modPotenz(376, 5173, 12344));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
#BlueJ package file
|
||||||
|
dependency1.from=SchnellePotenzierungTest
|
||||||
|
dependency1.to=SchnellePotenzierung
|
||||||
|
dependency1.type=UsesDependency
|
||||||
|
editor.fx.0.height=1013
|
||||||
|
editor.fx.0.width=1034
|
||||||
|
editor.fx.0.x=2009
|
||||||
|
editor.fx.0.y=31
|
||||||
|
objectbench.height=95
|
||||||
|
objectbench.width=770
|
||||||
|
package.divider.horizontal=0.6
|
||||||
|
package.divider.vertical=0.7992125984251969
|
||||||
|
package.editor.height=399
|
||||||
|
package.editor.width=643
|
||||||
|
package.editor.x=1735
|
||||||
|
package.editor.y=68
|
||||||
|
package.frame.height=600
|
||||||
|
package.frame.width=800
|
||||||
|
package.numDependencies=1
|
||||||
|
package.numTargets=2
|
||||||
|
package.showExtends=true
|
||||||
|
package.showUses=true
|
||||||
|
project.charset=UTF-8
|
||||||
|
readme.height=60
|
||||||
|
readme.name=@README
|
||||||
|
readme.width=49
|
||||||
|
readme.x=10
|
||||||
|
readme.y=10
|
||||||
|
target1.height=70
|
||||||
|
target1.name=SchnellePotenzierungTest
|
||||||
|
target1.showInterface=false
|
||||||
|
target1.type=UnitTestTargetJunit4
|
||||||
|
target1.width=220
|
||||||
|
target1.x=120
|
||||||
|
target1.y=70
|
||||||
|
target2.height=70
|
||||||
|
target2.name=SchnellePotenzierung
|
||||||
|
target2.showInterface=false
|
||||||
|
target2.type=ClassTarget
|
||||||
|
target2.width=190
|
||||||
|
target2.x=10
|
||||||
|
target2.y=160
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
This folder was generated on 2022-03-13 23:15:39
|
||||||
|
by Tippfilter version: 0.4-4-g83a7d89 (development build), built Donnerstag 2022-02-24 at 15:07:14)
|
||||||
|
|
||||||
|
using the following configuration:
|
||||||
|
|
||||||
|
original folder: /home/urs/Schreibtisch/kr-skript/schnelle-potenzierung
|
||||||
|
destination folder: /home/urs/Schreibtisch/kr-skript/sschnelle-postenzierung-MIT-TIPPS
|
||||||
|
overwrite destination folder: true
|
||||||
|
config files (order parsed): /home/urs/Schreibtisch/kr-skript/schnelle-potenzierung/bluej.tippfilter
|
||||||
|
filtered patterns: [file://*.java]
|
||||||
|
ignored patterns: [dir://.git, file://.gitignore, file://*.tippfilter, dir://doc, file://*.ctxt, dir://bin, file://*.class]
|
||||||
|
requested sections: {file://package.bluej=UNKNOWN}
|
||||||
|
global default audience: TIPP
|
||||||
|
all sections requested: true
|
||||||
|
audience for ALL sections: TIPP
|
||||||
|
write log file: true
|
||||||
|
write filter date: true
|
||||||
|
|
||||||
|
and the sections: written for audience:
|
||||||
|
|
||||||
|
1 dir:/ | TIPP |
|
||||||
|
2 file:/SchnellePotenzierung.java | TIPP |
|
||||||
|
3 file:/package.bluej | TIPP |
|
||||||
|
4 file:/SchnellePotenzierungTest.java | TIPP |
|
||||||
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung-ROHVERSION/.gitignore
vendored
Normal file
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung-ROHVERSION/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
*.sh
|
||||||
|
*.class
|
||||||
|
*.ctxt
|
||||||
|
repo.adoc
|
||||||
|
repo_subtree.adoc
|
||||||
|
/alt
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Filtered on Sonntag 2022-März-13 at 23:15:22 by Tippfilter 0.4-4-g83a7d89 (development build)
|
||||||
|
|
||||||
|
/** Diese Klasse enthält eine Methode zur schnellen modularen Potenzierung,
|
||||||
|
* die bei RSA und anderen modernen Kryptoverfahren zum Einsatz kommt.
|
||||||
|
*
|
||||||
|
* Sie ist als Programmierübung für Oberstufenschüler gedacht. Dabei stehen
|
||||||
|
* die rekursive Implementierung und die modulo-Operation im Vordergrund.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @author Tobias Nopper
|
||||||
|
* @version 2021-03-24
|
||||||
|
* Dieses Projekt steht unter der Lizenz CC BY-NC-SA 4.0
|
||||||
|
* This project is licensed under CC BY-NC-SA 4.0
|
||||||
|
* (https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode) */
|
||||||
|
public class SchnellePotenzierung {
|
||||||
|
|
||||||
|
/** Berechnet die modulare Potenz a^b mod m.
|
||||||
|
* Der Modulo der Rest bei der Division; 16:6 = 2 Rest 4, also ist
|
||||||
|
* 16 mod 6 = 4.
|
||||||
|
* Java hat dafür den Operator "%"; "16%6" liefert also 4.
|
||||||
|
* @param a Basis der Potenzierung
|
||||||
|
* @param b Exponent der Potenzierung
|
||||||
|
* @param m Modul der Restklasse, in der gerechnet wird
|
||||||
|
* @return Das Ergebnis der Rechnung a^b mod m. */
|
||||||
|
public static int modPotenz(int a, int b, int m) {
|
||||||
|
return -12345; // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Filtered on Sonntag 2022-März-13 at 23:15:22 by Tippfilter 0.4-4-g83a7d89 (development build)
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/** Die Test-Klasse SchnellePotenzierungTest enthält Tests für die gleichnamige
|
||||||
|
* Klasse mit Programmierübungen.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @version 2021-04 */
|
||||||
|
public class SchnellePotenzierungTest {
|
||||||
|
/** Konstruktor fuer die Test-Klasse SchnellePotenzierungTest */
|
||||||
|
public SchnellePotenzierungTest() { }
|
||||||
|
|
||||||
|
/** Wird vor jeder Testfall-Methode aufgerufen. */
|
||||||
|
@Before
|
||||||
|
public void setUp() { }
|
||||||
|
|
||||||
|
/** Wird nach jeder Testfall-Methode aufgerufen. */
|
||||||
|
@After
|
||||||
|
public void tearDown() { }
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEinfacheFaelle() {
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(3, 0, 5));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(88, 0, 15));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(75345, 0, 15));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 1, 5));
|
||||||
|
assertEquals(2, SchnellePotenzierung.modPotenz(2, 1, 5));
|
||||||
|
assertEquals(3, SchnellePotenzierung.modPotenz(3, 1, 5));
|
||||||
|
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 44));
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 45));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 44));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 45));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSoMittel() {
|
||||||
|
assertEquals(49, SchnellePotenzierung.modPotenz(7, 2, 100));
|
||||||
|
assertEquals(69, SchnellePotenzierung.modPotenz(13, 2, 100));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(9, 2, 152));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(3, 4, 1000));
|
||||||
|
assertEquals(24, SchnellePotenzierung.modPotenz(2, 10, 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGrosseZahlen() {
|
||||||
|
assertEquals(80, SchnellePotenzierung.modPotenz(37, 513, 101));
|
||||||
|
assertEquals(129, SchnellePotenzierung.modPotenz(376, 53, 1001));
|
||||||
|
assertEquals(5192, SchnellePotenzierung.modPotenz(376, 5173, 12344));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
#BlueJ package file
|
||||||
|
dependency1.from=SchnellePotenzierungTest
|
||||||
|
dependency1.to=SchnellePotenzierung
|
||||||
|
dependency1.type=UsesDependency
|
||||||
|
editor.fx.0.height=1013
|
||||||
|
editor.fx.0.width=1034
|
||||||
|
editor.fx.0.x=2009
|
||||||
|
editor.fx.0.y=31
|
||||||
|
objectbench.height=95
|
||||||
|
objectbench.width=770
|
||||||
|
package.divider.horizontal=0.6
|
||||||
|
package.divider.vertical=0.7992125984251969
|
||||||
|
package.editor.height=399
|
||||||
|
package.editor.width=643
|
||||||
|
package.editor.x=1735
|
||||||
|
package.editor.y=68
|
||||||
|
package.frame.height=600
|
||||||
|
package.frame.width=800
|
||||||
|
package.numDependencies=1
|
||||||
|
package.numTargets=2
|
||||||
|
package.showExtends=true
|
||||||
|
package.showUses=true
|
||||||
|
project.charset=UTF-8
|
||||||
|
readme.height=60
|
||||||
|
readme.name=@README
|
||||||
|
readme.width=49
|
||||||
|
readme.x=10
|
||||||
|
readme.y=10
|
||||||
|
target1.height=70
|
||||||
|
target1.name=SchnellePotenzierungTest
|
||||||
|
target1.showInterface=false
|
||||||
|
target1.type=UnitTestTargetJunit4
|
||||||
|
target1.width=220
|
||||||
|
target1.x=120
|
||||||
|
target1.y=70
|
||||||
|
target2.height=70
|
||||||
|
target2.name=SchnellePotenzierung
|
||||||
|
target2.showInterface=false
|
||||||
|
target2.type=ClassTarget
|
||||||
|
target2.width=190
|
||||||
|
target2.x=10
|
||||||
|
target2.y=160
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
This folder was generated on 2022-03-13 23:15:22
|
||||||
|
by Tippfilter version: 0.4-4-g83a7d89 (development build), built Donnerstag 2022-02-24 at 15:07:14)
|
||||||
|
|
||||||
|
using the following configuration:
|
||||||
|
|
||||||
|
original folder: /home/urs/Schreibtisch/kr-skript/schnelle-potenzierung
|
||||||
|
destination folder: /home/urs/Schreibtisch/kr-skript/sschnelle-postenzierung-ROHVERSION
|
||||||
|
overwrite destination folder: true
|
||||||
|
config files (order parsed): /home/urs/Schreibtisch/kr-skript/schnelle-potenzierung/bluej.tippfilter
|
||||||
|
filtered patterns: [file://*.java]
|
||||||
|
ignored patterns: [dir://.git, file://.gitignore, file://*.tippfilter, dir://doc, file://*.ctxt, dir://bin, file://*.class]
|
||||||
|
requested sections: {file://package.bluej=UNKNOWN}
|
||||||
|
global default audience: RAW
|
||||||
|
all sections requested: true
|
||||||
|
audience for ALL sections: RAW
|
||||||
|
write log file: true
|
||||||
|
write filter date: true
|
||||||
|
|
||||||
|
and the sections: written for audience:
|
||||||
|
|
||||||
|
1 dir:/ | RAW |
|
||||||
|
2 file:/SchnellePotenzierung.java | RAW |
|
||||||
|
3 file:/package.bluej | RAW |
|
||||||
|
4 file:/SchnellePotenzierungTest.java | RAW |
|
||||||
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung/.gitignore
vendored
Normal file
6
Software/IuD_Schnelle_Potenzierung_BJ/schnelle-potenzierung/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
*.sh
|
||||||
|
*.class
|
||||||
|
*.ctxt
|
||||||
|
repo.adoc
|
||||||
|
repo_subtree.adoc
|
||||||
|
/alt
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
//#? anfang-lehrer
|
||||||
|
/* Diese Datei enthält Zeilen, die mit //#? anfangen. Sie sind als Markup
|
||||||
|
* für das Werkzeug Tippfilter gedacht: Tippfilter kann anhand dieses
|
||||||
|
* Markup Versionen der Datei für unterschiedliche Zielgruppen erzeugen.
|
||||||
|
*
|
||||||
|
* Falls Sie die Datei verändern und dann neu filtern wollen, bekommen Sie
|
||||||
|
* Tippfilter hier:
|
||||||
|
*
|
||||||
|
* https://googlefrei.owncube.com/index.php/s/HiMccHZqfD3DtnE
|
||||||
|
*/
|
||||||
|
//#? ende-lehrer
|
||||||
|
|
||||||
|
/** Diese Klasse enthält eine Methode zur schnellen modularen Potenzierung,
|
||||||
|
* die bei RSA und anderen modernen Kryptoverfahren zum Einsatz kommt.
|
||||||
|
*
|
||||||
|
* Sie ist als Programmierübung für Oberstufenschüler gedacht. Dabei stehen
|
||||||
|
* die rekursive Implementierung und die modulo-Operation im Vordergrund.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @author Tobias Nopper
|
||||||
|
* @version 2021-03-24
|
||||||
|
* Dieses Projekt steht unter der Lizenz CC BY-NC-SA 4.0
|
||||||
|
* This project is licensed under CC BY-NC-SA 4.0
|
||||||
|
* (https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode) */
|
||||||
|
public class SchnellePotenzierung {
|
||||||
|
|
||||||
|
/** Berechnet die modulare Potenz a^b mod m.
|
||||||
|
* Der Modulo der Rest bei der Division; 16:6 = 2 Rest 4, also ist
|
||||||
|
* 16 mod 6 = 4.
|
||||||
|
* Java hat dafür den Operator "%"; "16%6" liefert also 4.
|
||||||
|
* @param a Basis der Potenzierung
|
||||||
|
* @param b Exponent der Potenzierung
|
||||||
|
* @param m Modul der Restklasse, in der gerechnet wird
|
||||||
|
* @return Das Ergebnis der Rechnung a^b mod m. */
|
||||||
|
public static int modPotenz(int a, int b, int m) {
|
||||||
|
//#? tipp // Tipp: Überlegen Sie, was bei der Potenzierung a^b der einfachste
|
||||||
|
//#? tipp // Fall ist (oder die einfachsten Fälle); die gleiche Überlegung gilt
|
||||||
|
//#? tipp // auch für a^b mod m.
|
||||||
|
//#? tipp // Überlegen Sie dann, wie Sie andere Fälle darauf reduzieren können.
|
||||||
|
//#? anfang-hilfe
|
||||||
|
/* Man kann für b >= 0 die folgenden Fälle unterscheiden:
|
||||||
|
*
|
||||||
|
* | 1 , falls b == 0
|
||||||
|
* | a , falls b == 1
|
||||||
|
* a^b mod m = | (a^(b-1))*a , falls b ungerade
|
||||||
|
* | (a^(b/2))^2 , sonst
|
||||||
|
*
|
||||||
|
* Analysieren Sie, ob Sie statt mit vier Fällen auch mit drei auskommen.
|
||||||
|
*
|
||||||
|
* Achtung: In der obigen Fallunterscheidung müssen die Zwischenergebnisse
|
||||||
|
* _aller_ Rechenoperationen jeweils modulo m verkleinert werden (das mod m
|
||||||
|
* ist der Übersicht wegen nur nicht aufgeschrieben). Weil Zwischenergebnisse
|
||||||
|
* sehr groß werden können, nimmt man für sie den Datentyp long.
|
||||||
|
*
|
||||||
|
* Auch den Test gerade/ungerade kann man mit Modulo realisieren. */
|
||||||
|
//#? end-hilfe
|
||||||
|
//#? begin-lsg
|
||||||
|
|
||||||
|
//#? help // Der Basisfall ist b=0, dann ist das Ergebnis 1:
|
||||||
|
if(b == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//#? tipp // Das Zwischenergebnis kann größer sein, als int-Variablen
|
||||||
|
//#? tipp // aufnehmen können, deswegen nimmt man dafür den Datentyp long:
|
||||||
|
long zwischenergebnis;
|
||||||
|
|
||||||
|
//#? help // o Wenn b gerade, also b%2==1, dann...
|
||||||
|
if(b % 2 == 1) {
|
||||||
|
//#? help // - berechne a^(b-1) mod m (rekursiv) und speichere das Ergebnis
|
||||||
|
zwischenergebnis = modPotenz(a, b - 1, m);
|
||||||
|
|
||||||
|
//#? help // - multipliziere einmal a "dazu":
|
||||||
|
zwischenergebnis = zwischenergebnis * a;
|
||||||
|
|
||||||
|
//#? help // o sonst (wenn also b gerade), dann...
|
||||||
|
} else {
|
||||||
|
//#? help // - berechne a^(b/2) mod m (rekursiv!), merk dir das Ergebnis...
|
||||||
|
zwischenergebnis = modPotenz(a, b/2, m);
|
||||||
|
|
||||||
|
//#? help // - ... und quadriere es
|
||||||
|
zwischenergebnis = zwischenergebnis * zwischenergebnis ;
|
||||||
|
}
|
||||||
|
//#? help // o verkleinere das Zwischenergebnis modulo m:
|
||||||
|
zwischenergebnis = zwischenergebnis % m;
|
||||||
|
|
||||||
|
//#? help // o wandle es zurück nach int (woher wissen wir, dass es jetzt
|
||||||
|
//#? help // auf jeden Fall in einen int passt?) und gib es zurück:
|
||||||
|
return (int) zwischenergebnis;
|
||||||
|
//#? end-lsg
|
||||||
|
//#? dummycode return -12345; // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/** Die Test-Klasse SchnellePotenzierungTest enthält Tests für die gleichnamige
|
||||||
|
* Klasse mit Programmierübungen.
|
||||||
|
*
|
||||||
|
* @author Urs Lautebach
|
||||||
|
* @version 2021-04 */
|
||||||
|
public class SchnellePotenzierungTest {
|
||||||
|
/** Konstruktor fuer die Test-Klasse SchnellePotenzierungTest */
|
||||||
|
public SchnellePotenzierungTest() { }
|
||||||
|
|
||||||
|
/** Wird vor jeder Testfall-Methode aufgerufen. */
|
||||||
|
@Before
|
||||||
|
public void setUp() { }
|
||||||
|
|
||||||
|
/** Wird nach jeder Testfall-Methode aufgerufen. */
|
||||||
|
@After
|
||||||
|
public void tearDown() { }
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEinfacheFaelle() {
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(3, 0, 5));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(2, 0, 5));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(88, 0, 15));
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(75345, 0, 15));
|
||||||
|
|
||||||
|
assertEquals(1, SchnellePotenzierung.modPotenz(1, 1, 5));
|
||||||
|
assertEquals(2, SchnellePotenzierung.modPotenz(2, 1, 5));
|
||||||
|
assertEquals(3, SchnellePotenzierung.modPotenz(3, 1, 5));
|
||||||
|
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 44));
|
||||||
|
assertEquals(17, SchnellePotenzierung.modPotenz(17, 1, 45));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 44));
|
||||||
|
assertEquals(7, SchnellePotenzierung.modPotenz(7, 1, 45));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSoMittel() {
|
||||||
|
assertEquals(49, SchnellePotenzierung.modPotenz(7, 2, 100));
|
||||||
|
assertEquals(69, SchnellePotenzierung.modPotenz(13, 2, 100));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(9, 2, 152));
|
||||||
|
assertEquals(81, SchnellePotenzierung.modPotenz(3, 4, 1000));
|
||||||
|
assertEquals(24, SchnellePotenzierung.modPotenz(2, 10, 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGrosseZahlen() {
|
||||||
|
assertEquals(80, SchnellePotenzierung.modPotenz(37, 513, 101));
|
||||||
|
assertEquals(129, SchnellePotenzierung.modPotenz(376, 53, 1001));
|
||||||
|
assertEquals(5192, SchnellePotenzierung.modPotenz(376, 5173, 12344));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Diese Datei konfiguriert Tippfilter für ein typisches BlueJ-Projekt
|
||||||
|
|
||||||
|
// diese Datei ignorieren:
|
||||||
|
ignore=file://*.tippfilter
|
||||||
|
|
||||||
|
# alle .class- und .ctxt-Dateien ignorieren:
|
||||||
|
ignoriere=file://*.class
|
||||||
|
ignoriere=file://*.ctxt
|
||||||
|
|
||||||
|
# Ordner mit Git, Javadoc und compilierten Dateien ignorieren:
|
||||||
|
ignoriere=dir://.git
|
||||||
|
ignoriere=file://.gitignore
|
||||||
|
ignoriere=dir://doc
|
||||||
|
ignoriere=dir://bin
|
||||||
|
|
||||||
|
# Java-Dateien filtern:
|
||||||
|
filter=file://*.java
|
||||||
|
|
||||||
|
# BlueJ-Projektdateien immer übernehmen:
|
||||||
|
nimm=file://package.bluej
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
#BlueJ package file
|
||||||
|
dependency1.from=SchnellePotenzierungTest
|
||||||
|
dependency1.to=SchnellePotenzierung
|
||||||
|
dependency1.type=UsesDependency
|
||||||
|
editor.fx.0.height=1013
|
||||||
|
editor.fx.0.width=1034
|
||||||
|
editor.fx.0.x=2009
|
||||||
|
editor.fx.0.y=31
|
||||||
|
objectbench.height=95
|
||||||
|
objectbench.width=770
|
||||||
|
package.divider.horizontal=0.6
|
||||||
|
package.divider.vertical=0.7992125984251969
|
||||||
|
package.editor.height=399
|
||||||
|
package.editor.width=643
|
||||||
|
package.editor.x=1735
|
||||||
|
package.editor.y=68
|
||||||
|
package.frame.height=600
|
||||||
|
package.frame.width=800
|
||||||
|
package.numDependencies=1
|
||||||
|
package.numTargets=2
|
||||||
|
package.showExtends=true
|
||||||
|
package.showUses=true
|
||||||
|
project.charset=UTF-8
|
||||||
|
readme.height=60
|
||||||
|
readme.name=@README
|
||||||
|
readme.width=49
|
||||||
|
readme.x=10
|
||||||
|
readme.y=10
|
||||||
|
target1.height=70
|
||||||
|
target1.name=SchnellePotenzierungTest
|
||||||
|
target1.showInterface=false
|
||||||
|
target1.type=UnitTestTargetJunit4
|
||||||
|
target1.width=220
|
||||||
|
target1.x=120
|
||||||
|
target1.y=70
|
||||||
|
target2.height=70
|
||||||
|
target2.name=SchnellePotenzierung
|
||||||
|
target2.showInterface=false
|
||||||
|
target2.type=ClassTarget
|
||||||
|
target2.width=190
|
||||||
|
target2.x=10
|
||||||
|
target2.y=160
|
||||||
Loading…
Add table
Add a link
Reference in a new issue