IIm18-Kreativaufgabe7

Aus ProgrammingWiki

Inhaltsverzeichnis

Random Access Maschine - Paul Bachmann, Johannes Thies

RAM zur Ermittlung von \left\lfloor \sqrt{n} \right\rfloor

Geben Sie mind. ein RAM-Programm zur Berechnung der Funktion w : \N \mapsto \N mit w(n) = \left\lfloor \sqrt{n} \right\rfloor an.

Ermittlung der Potenz

BefehlszählerAnweisungBemerkung
|
0
R0 = nbelegen von R0 mit einer natürlichen Zahl n
|
1
R1 = 1fixer Wert für Inkrementierung/Dekrementierung
|
2
R2 = R0Festlegung einer Zählvariable der Größe n
|
3
R3 = 0R3 als Platzhalter für das Ergebnis
|
4
R3 += R0Inkrementierung von R3 um n
|
5
R2 -= R1Dekrementierung der Zählvariable
|
6
IFZERO R2 GOTO 8wenn Zählvariable 0 ist, dann steht das Ergebnis in R3
|
7
GOTO 4R1 von R0 subtrahieren
|
8
R0 = R3Ergebnis in R0 speichern
|
9
STOP

Realisierung des logischen Operators \leq

Kein RAM, sondern nur eine Visualisierung des Gedankenganges beim Vergleich zweier natürlicher Zahlen!

BefehlszählerAnweisungBemerkung
|
0
R0 = abelegen von R0 mit der ersten natürlichen Zahl a
|
1
R1 = bbelegen von R1 mit der ersten natürlichen Zahl b
|
2
R0 -= R1Dekrementierung von R0 um R1
|
3
IFZERO R0 GOTO ...Wenn R0 = 0, dann ist der Ursprüngliche Wert von R0 \leq R1, wenn nicht, dann ist R0 > R1

Kombination beider Funktionen zur Ermittlung von \left\lfloor \sqrt{n} \right\rfloor

BefehlszählerAnweisungBemerkung
|
0
R0 = nbelegen von R0 mit einer natürlichen Zahl n
|
1
R1 = 1fixer Wert für Inkrementierung/Dekrementierung
|
2
R2 += R1Zähler (Testvariable)
|
3
R22 = R2Potenz Zählvariable
|
4
R33 += R2Inkrementierung von R3 um R2 zur Berechnung der Potenz von Testvariable
|
5
R22 -= R1Dekrementierung der Potenz Zählvariable
|
6
IFZERO R22 GOTO 8wenn Zählvariable 0 ist, dann steht das Ergebnis in R33
|
7
GOTO 4Inkrementiere R33 solange bis Potenz Zählvariable 0 beträgt
|
8
R33 -= R0kleinergelich Vergleich von Potenzergebnis und n
|
9
IFZERO R33 GOTO 2wenn R33 0 beträgt, dann ist Potenz von Testvariable \leq n
|
10
R2 -= R1Dekrementierung von R2 um 1, wenn Potenz der Testvariable zum ersten mal größer ist als n, da wir floor berechnen wollen
|
11
R0 = R2Ergebnis in R0 speichern

Beispiel für n = 10

AnweisungR0R1R1R22R33
|R0 = n100000
|R1 = 1101000
|R2 = R0101000
|R2 += R1101100
|R22 = R2101110
|R33 += R2101111
|R22 -= R1101101
|IFZERO R22 GOTO 10101101
|R33 -= R0101100
|IFZERO R22 GOTO 10101100
|R2 += R1101200
|R22 = R2101220
|R33 += R2101222
|R22 -= R1101212
|IFZERO R22 GOTO 10101212
|GOTO 6101212
|R33 += R2101214
|R22 -= R1101204
|IFZERO R22 GOTO 10101204
|R33 -= R0101200
|IFZERO R22 GOTO 10101200
|R2 += R1101300
|R22 = R2101330
|R33 += R2101333
|R22 -= R1101323
|IFZERO R22 GOTO 10101323
|GOTO 6101323
|R33 += R2101326
|R22 -= R1101316
|IFZERO R22 GOTO 10101316
|GOTO 6101316
|R33 += R2101319
|R22 -= R1101309
|IFZERO R22 GOTO 10101309
|R33 -= R0101300
|IFZERO R22 GOTO 10101300
|R2 += R1101400
|R22 = R2101440
|R33 += R2101444
|R22 -= R1101434
|IFZERO R22 GOTO 10101434
|GOTO 6101434
|R33 += R2101438
|R22 -= R1101428
|IFZERO R22 GOTO 10101428
|GOTO 6101428
|R33 += R21014212
|R22 -= R11014112
|IFZERO R22 GOTO 101014112
|GOTO 61014112
|R33 += R21014116
|R22 -= R11014016
|IFZERO R22 GOTO 101014016
|R33 -= R0101406
|IFZERO R22 GOTO 10101406
|R2 -= R1101306
|R0 = R231306


Beispiel für n = 16

AnweisungR0R1R1R22R33
|R0 = n160000
|R1 = 1161000
|R2 = R0161000
|R2 += R1161100
|R22 = R2161110
|R33 += R2161111
|R22 -= R1161101
|IFZERO R22 GOTO 10161101
|R33 -= R0161100
|IFZERO R22 GOTO 10161100
|R2 += R1161200
|R22 = R2161220
|R33 += R2161222
|R22 -= R1161212
|IFZERO R22 GOTO 10161212
|GOTO 6161212
|R33 += R2161214
|R22 -= R1161204
|IFZERO R22 GOTO 10161204
|R33 -= R0161200
|IFZERO R22 GOTO 10161200
|R2 += R1161300
|R22 = R2161330
|R33 += R2161333
|R22 -= R1161323
|IFZERO R22 GOTO 10161323
|GOTO 6161323
|R33 += R2161326
|R22 -= R1161316
|IFZERO R22 GOTO 10161316
|GOTO 6161316
|R33 += R2161319
|R22 -= R1161309
|IFZERO R22 GOTO 10161309
|R33 -= R0161300
|IFZERO R22 GOTO 10161300
|R2 += R1161400
|R22 = R2161440
|R33 += R2161444
|R22 -= R1161434
|IFZERO R22 GOTO 10161434
|GOTO 6161434
|R33 += R2161438
|R22 -= R1161428
|IFZERO R22 GOTO 10161428
|GOTO 6161428
|R33 += R21614212
|R22 -= R11614112
|IFZERO R22 GOTO 101614112
|GOTO 61614112
|R33 += R21614116
|R22 -= R11614016
|IFZERO R22 GOTO 101614016
|R33 -= R0161400
|IFZERO R22 GOTO 10161400
|R2 += R1161500
|R22 = R2161550
|R33 += R2161555
|R22 -= R1161545
|IFZERO R22 GOTO 10161545
|GOTO 6161545
|R33 += R21615410
|R22 -= R11615310
|IFZERO R22 GOTO 101615310
|GOTO 61615310
|R33 += R21615315
|R22 -= R11615215
|IFZERO R22 GOTO 101615215
|GOTO 61615215
|R33 += R21615220
|R22 -= R11615120
|IFZERO R22 GOTO 101615120
|GOTO 61615120
|R33 += R21615125
|R22 -= R11615025
|IFZERO R22 GOTO 101615025
|R33 -= R0161509
|IFZERO R22 GOTO 10161509
|R2 -= R1161409
|R0 = R241409


Beispiel für n = 77

AnweisungR0R1R1R22R33
|R0 = n770000
|R1 = 1771000
|R2 = R0771000
|R2 += R1771100
|R22 = R2771110
|R33 += R2771111
|R22 -= R1771101
|IFZERO R22 GOTO 10771101
|R33 -= R0771100
|IFZERO R22 GOTO 10771100
|R2 += R1771200
|R22 = R2771220
|R33 += R2771222
|R22 -= R1771212
|IFZERO R22 GOTO 10771212
|GOTO 6771212
|R33 += R2771214
|R22 -= R1771204
|IFZERO R22 GOTO 10771204
|R33 -= R0771200
|IFZERO R22 GOTO 10771200
|R2 += R1771300
|R22 = R2771330
|R33 += R2771333
|R22 -= R1771323
|IFZERO R22 GOTO 10771323
|GOTO 6771323
|R33 += R2771326
|R22 -= R1771316
|IFZERO R22 GOTO 10771316
|GOTO 6771316
|R33 += R2771319
|R22 -= R1771309
|IFZERO R22 GOTO 10771309
|R33 -= R0771300
|IFZERO R22 GOTO 10771300
|R2 += R1771400
|R22 = R2771440
|R33 += R2771444
|R22 -= R1771434
|IFZERO R22 GOTO 10771434
|GOTO 6771434
|R33 += R2771438
|R22 -= R1771428
|IFZERO R22 GOTO 10771428
|GOTO 6771428
|R33 += R27714212
|R22 -= R17714112
|IFZERO R22 GOTO 107714112
|GOTO 67714112
|R33 += R27714116
|R22 -= R17714016
|IFZERO R22 GOTO 107714016
|R33 -= R0771400
|IFZERO R22 GOTO 10771400
|R2 += R1771500
|R22 = R2771550
|R33 += R2771555
|R22 -= R1771545
|IFZERO R22 GOTO 10771545
|GOTO 6771545
|R33 += R27715410
|R22 -= R17715310
|IFZERO R22 GOTO 107715310
|GOTO 67715310
|R33 += R27715315
|R22 -= R17715215
|IFZERO R22 GOTO 107715215
|GOTO 67715215
|R33 += R27715220
|R22 -= R17715120
|IFZERO R22 GOTO 107715120
|GOTO 67715120
|R33 += R27715125
|R22 -= R17715025
|IFZERO R22 GOTO 107715025
|R33 -= R0771500
|IFZERO R22 GOTO 10771500
|R2 += R1771600
|R22 = R2771660
|R33 += R2771666
|R22 -= R1771656
|IFZERO R22 GOTO 10771656
|GOTO 6771656
|R33 += R27716512
|R22 -= R17716412
|IFZERO R22 GOTO 107716412
|GOTO 67716412
|R33 += R27716418
|R22 -= R17716318
|IFZERO R22 GOTO 107716318
|GOTO 67716318
|R33 += R27716324
|R22 -= R17716224
|IFZERO R22 GOTO 107716224
|GOTO 67716224
|R33 += R27716230
|R22 -= R17716130
|IFZERO R22 GOTO 107716130
|GOTO 67716130
|R33 += R27716136
|R22 -= R17716036
|IFZERO R22 GOTO 107716036
|R33 -= R0771600
|IFZERO R22 GOTO 10771600
|R2 += R1771700
|R22 = R2771770
|R33 += R2771777
|R22 -= R1771767
|IFZERO R22 GOTO 10771767
|GOTO 6771767
|R33 += R27717614
|R22 -= R17717514
|IFZERO R22 GOTO 107717514
|GOTO 67717514
|R33 += R27717521
|R22 -= R17717421
|IFZERO R22 GOTO 107717421
|GOTO 67717421
|R33 += R27717428
|R22 -= R17717328
|IFZERO R22 GOTO 107717328
|GOTO 67717328
|R33 += R27717335
|R22 -= R17717235
|IFZERO R22 GOTO 107717235
|GOTO 67717235
|R33 += R27717242
|R22 -= R17717142
|IFZERO R22 GOTO 107717142
|GOTO 67717142
|R33 += R27717149
|R22 -= R17717049
|IFZERO R22 GOTO 107717049
|R33 -= R0771700
|IFZERO R22 GOTO 10771700
|R2 += R1771800
|R22 = R2771880
|R33 += R2771888
|R22 -= R1771878
|IFZERO R22 GOTO 10771878
|GOTO 6771878
|R33 += R27718716
|R22 -= R17718616
|IFZERO R22 GOTO 107718616
|GOTO 67718616
|R33 += R27718624
|R22 -= R17718524
|IFZERO R22 GOTO 107718524
|GOTO 67718524
|R33 += R27718532
|R22 -= R17718432
|IFZERO R22 GOTO 107718432
|GOTO 67718432
|R33 += R27718440
|R22 -= R17718340
|IFZERO R22 GOTO 107718340
|GOTO 67718340
|R33 += R27718348
|R22 -= R17718248
|IFZERO R22 GOTO 107718248
|GOTO 67718248
|R33 += R27718256
|R22 -= R17718156
|IFZERO R22 GOTO 107718156
|GOTO 67718156
|R33 += R27718164
|R22 -= R17718064
|IFZERO R22 GOTO 107718064
|R33 -= R0771800
|IFZERO R22 GOTO 10771800
|R2 += R1771900
|R22 = R2771990
|R33 += R2771999
|R22 -= R1771989
|IFZERO R22 GOTO 10771989
|GOTO 6771989
|R33 += R27719818
|R22 -= R17719718
|IFZERO R22 GOTO 107719718
|GOTO 67719718
|R33 += R27719727
|R22 -= R17719627
|IFZERO R22 GOTO 107719627
|GOTO 67719627
|R33 += R27719636
|R22 -= R17719536
|IFZERO R22 GOTO 107719536
|GOTO 67719536
|R33 += R27719545
|R22 -= R17719445
|IFZERO R22 GOTO 107719445
|GOTO 67719445
|R33 += R27719454
|R22 -= R17719354
|IFZERO R22 GOTO 107719354
|GOTO 67719354
|R33 += R27719363
|R22 -= R17719263
|IFZERO R22 GOTO 107719263
|GOTO 67719263
|R33 += R27719272
|R22 -= R17719172
|IFZERO R22 GOTO 107719172
|GOTO 67719172
|R33 += R27719181
|R22 -= R17719081
|IFZERO R22 GOTO 107719081
|R33 -= R0771904
|IFZERO R22 GOTO 10771904
|R2 -= R1771804
|R0 = R281804

RAM zur Ermittlung des größten gemeinsamen Teilers (ggt) - Euklidischer Algorithmus

BefehlszählerAnweisungBemerkung
|
0
R0 = abelegen von R0 mit der ersten natürlichen Zahl a
|
1
R1 = bbelegen von R1 mit der ersten natürlichen Zahl b
|
2
IFZERO R1 GOTO 12Sprung zu 12 da R0 das Ergebnis beinhaltet
|
3
IFZERO R0 GOTO 11Sprung zu 11 da R1 das Ergebnis beinhaltet
|
4
R2 = R0Zwischenspeichern von R0 in R2 für Größer vergleich
|
5
R2 -= R1R1 von R2 subtrahieren für Größer vergleich
|
6
IFZERO R2 GOTO 9wenn R2 0 ist, ist R1 > R0
|
7
R0 -= R1R1 von R0 subtrahieren
|
8
GOTO 2Sprung zum Schleifenanfang
|
9
R1 -= R0R0 von R1 subtrahieren
|
10
GOTO 2Sprung zum Schleifenanfang
|
11
R0 = R1Ergebnis in R0 schreiben
|
12
STOP


Beispiel mit a = 2 und b = 4

AnweisungR0R1R1
|R0 = a200
|R1 = b240
|IFZERO R1 GOTO 12240
|IFZERO R0 GOTO 11240
|R2 = R0242
|R2 -= R1240
|IFZERO R2 GOTO 11240
|R1 -= R0220
|GOTO 2220
|IFZERO R1 GOTO 12220
|IFZERO R0 GOTO 11220
|R2 = R0222
|R2 -= R1220
|IFZERO R2 GOTO 11220
|R1 -= R0200
|GOTO 2200
|IFZERO R1 GOTO 12200


Beispiel mit a = 2 und b = 15

AnweisungR0R1R1
|R0 = a200
|R1 = b2150
|IFZERO R1 GOTO 122150
|IFZERO R0 GOTO 112150
|R2 = R02152
|R2 -= R12150
|IFZERO R2 GOTO 112150
|R1 -= R02130
|GOTO 22130
|IFZERO R1 GOTO 122130
|IFZERO R0 GOTO 112130
|R2 = R02132
|R2 -= R12130
|IFZERO R2 GOTO 112130
|R1 -= R02110
|GOTO 22110
|IFZERO R1 GOTO 122110
|IFZERO R0 GOTO 112110
|R2 = R02112
|R2 -= R12110
|IFZERO R2 GOTO 112110
|R1 -= R0290
|GOTO 2290
|IFZERO R1 GOTO 12290
|IFZERO R0 GOTO 11290
|R2 = R0292
|R2 -= R1290
|IFZERO R2 GOTO 11290
|R1 -= R0270
|GOTO 2270
|IFZERO R1 GOTO 12270
|IFZERO R0 GOTO 11270
|R2 = R0272
|R2 -= R1270
|IFZERO R2 GOTO 11270
|R1 -= R0250
|GOTO 2250
|IFZERO R1 GOTO 12250
|IFZERO R0 GOTO 11250
|R2 = R0252
|R2 -= R1250
|IFZERO R2 GOTO 11250
|R1 -= R0230
|GOTO 2230
|IFZERO R1 GOTO 12230
|IFZERO R0 GOTO 11230
|R2 = R0232
|R2 -= R1230
|IFZERO R2 GOTO 11230
|R1 -= R0210
|GOTO 2210
|IFZERO R1 GOTO 12210
|IFZERO R0 GOTO 11210
|R2 = R0212
|R2 -= R1211
|IFZERO R2 GOTO 11211
|R0 -= R1111
|GOTO 2111
|IFZERO R1 GOTO 12111
|IFZERO R0 GOTO 11111
|R2 = R0111
|R2 -= R1110
|IFZERO R2 GOTO 11110
|R1 -= R0100
|GOTO 2100
|IFZERO R1 GOTO 12100


Beispiel mit a = 119 und b = 7

AnweisungR0R1R1
|R0 = a11900
|R1 = b11970
|IFZERO R1 GOTO 1211970
|IFZERO R0 GOTO 1111970
|R2 = R01197119
|R2 -= R11197112
|IFZERO R2 GOTO 111197112
|R0 -= R11127112
|GOTO 21127112
|IFZERO R1 GOTO 121127112
|IFZERO R0 GOTO 111127112
|R2 = R01127112
|R2 -= R11127105
|IFZERO R2 GOTO 111127105
|R0 -= R11057105
|GOTO 21057105
|IFZERO R1 GOTO 121057105
|IFZERO R0 GOTO 111057105
|R2 = R01057105
|R2 -= R1105798
|IFZERO R2 GOTO 11105798
|R0 -= R198798
|GOTO 298798
|IFZERO R1 GOTO 1298798
|IFZERO R0 GOTO 1198798
|R2 = R098798
|R2 -= R198791
|IFZERO R2 GOTO 1198791
|R0 -= R191791
|GOTO 291791
|IFZERO R1 GOTO 1291791
|IFZERO R0 GOTO 1191791
|R2 = R091791
|R2 -= R191784
|IFZERO R2 GOTO 1191784
|R0 -= R184784
|GOTO 284784
|IFZERO R1 GOTO 1284784
|IFZERO R0 GOTO 1184784
|R2 = R084784
|R2 -= R184777
|IFZERO R2 GOTO 1184777
|R0 -= R177777
|GOTO 277777
|IFZERO R1 GOTO 1277777
|IFZERO R0 GOTO 1177777
|R2 = R077777
|R2 -= R177770
|IFZERO R2 GOTO 1177770
|R0 -= R170770
|GOTO 270770
|IFZERO R1 GOTO 1270770
|IFZERO R0 GOTO 1170770
|R2 = R070770
|R2 -= R170763
|IFZERO R2 GOTO 1170763
|R0 -= R163763
|GOTO 263763
|IFZERO R1 GOTO 1263763
|IFZERO R0 GOTO 1163763
|R2 = R063763
|R2 -= R163756
|IFZERO R2 GOTO 1163756
|R0 -= R156756
|GOTO 256756
|IFZERO R1 GOTO 1256756
|IFZERO R0 GOTO 1156756
|R2 = R056756
|R2 -= R156749
|IFZERO R2 GOTO 1156749
|R0 -= R149749
|GOTO 249749
|IFZERO R1 GOTO 1249749
|IFZERO R0 GOTO 1149749
|R2 = R049749
|R2 -= R149742
|IFZERO R2 GOTO 1149742
|R0 -= R142742
|GOTO 242742
|IFZERO R1 GOTO 1242742
|IFZERO R0 GOTO 1142742
|R2 = R042742
|R2 -= R142735
|IFZERO R2 GOTO 1142735
|R0 -= R135735
|GOTO 235735
|IFZERO R1 GOTO 1235735
|IFZERO R0 GOTO 1135735
|R2 = R035735
|R2 -= R135728
|IFZERO R2 GOTO 1135728
|R0 -= R128728
|GOTO 228728
|IFZERO R1 GOTO 1228728
|IFZERO R0 GOTO 1128728
|R2 = R028728
|R2 -= R128721
|IFZERO R2 GOTO 1128721
|R0 -= R121721
|GOTO 221721
|IFZERO R1 GOTO 1221721
|IFZERO R0 GOTO 1121721
|R2 = R021721
|R2 -= R121714
|IFZERO R2 GOTO 1121714
|R0 -= R114714
|GOTO 214714
|IFZERO R1 GOTO 1214714
|IFZERO R0 GOTO 1114714
|R2 = R014714
|R2 -= R11477
|IFZERO R2 GOTO 111477
|R0 -= R1777
|GOTO 2777
|IFZERO R1 GOTO 12777
|IFZERO R0 GOTO 11777
|R2 = R0777
|R2 -= R1770
|IFZERO R2 GOTO 11770
|R1 -= R0700
|GOTO 2700
|IFZERO R1 GOTO 12700