Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

X * y < z ?

Diskussion: X * y < z ? im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Abstrakt: Prüfe, ob dass Produkt zweier beliebigen Zahlen kleiner ist als eine weitere Zahl - OHNE das Produkt zu berechnen ...

Antwort
Alt 24.11.09, 14:20   #1 (permalink)
 
Registriert seit: 12.01.09
lone.wolf Leistung: Z3
lone.wolf eine Nachricht über AIM schicken
Likes: 1
Standard X * y < z ?


Abstrakt:
Prüfe, ob dass Produkt zweier beliebigen Zahlen kleiner ist als eine
weitere Zahl - OHNE das Produkt zu berechnen

x * y <= z ?

Beispiel: RSA
P*Q soll kleiner als 2^64 sein.

Folgendes noch: Auf Overflow prüfen ist nicht erlaubt!

MfG

lone.wolf ist offline   Mit Zitat antworten
Alt 24.11.09, 16:02   #2 (permalink)
 
Registriert seit: 16.04.07
D31~$0u1 Leistung: Facit NTK
D31~$0u1 eine Nachricht über ICQ schicken
Likes: 0
Standard

Also, warum man das Produkt nicht ausrechnen soll, versteh ich zwar nicht, aber so müsste es im Prinzip gehen:

Code:
If (X*Y) < Z then
Lg, D31~$0u1
D31~$0u1 ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 24.11.09, 16:17   #3 (permalink)
 
Benutzerbild von detrexer
 
Registriert seit: 04.04.07
detrexer Leistung: Facit NTK
detrexer eine Nachricht über ICQ schicken detrexer eine Nachricht über MSN schicken
Likes: 0
Standard

ähm ... teilen?

X*Y < Z |/X
y < Z/X
__________________
Mein Blog: http://keinwegraus.wordpress.com/
detrexer ist offline   Mit Zitat antworten
Alt 24.11.09, 16:38   #4 (permalink)
 
Benutzerbild von ChiefWiggum
 
Registriert seit: 09.10.07
ChiefWiggum Leistung: 8086
ChiefWiggum eine Nachricht über ICQ schicken
Likes: 11
Standard

x * y <= z

"Eine Division ist eine Multiplikation mit dem Kehrwert"
Also:
x / (1/y)
__________________
Be the source always with you.
ChiefWiggum ist offline   Mit Zitat antworten
Alt 24.11.09, 18:16   #5 (permalink)
Senior Member
 
Benutzerbild von sw33tlull4by
 
Registriert seit: 12.06.07
sw33tlull4by Leistung: Facit NTK
Likes: 0
Standard

Wie wäre es mit umformung?
x*y <= z
y <=z/x bzw. x<=z/y

//edit
bevor das unklar wird:
es müssen beide Bedingungen erfüllt sein damit x*y <= z wirklich stimmt
__________________
Nur die Schwachen klammern sich an die Moral.

Kill my daemons and my angels will follow them.

Geändert von sw33tlull4by (24.11.09 um 18:25 Uhr) Grund: dachte mal ich bin gründlicher und nicht fauler^^
sw33tlull4by ist offline   Mit Zitat antworten
Alt 24.11.09, 20:57   #6 (permalink)
 
Benutzerbild von ChiefWiggum
 
Registriert seit: 09.10.07
ChiefWiggum Leistung: 8086
ChiefWiggum eine Nachricht über ICQ schicken
Likes: 11
Standard

Zitat:
Zitat von sw33tlull4by Beitrag anzeigen
bevor das unklar wird:
es müssen beide Bedingungen erfüllt sein damit x*y <= z wirklich stimmt
Da bin ich aber anderer Meinung.
Wenn die eine [Bedingung] Zutrifft, dann WIRD die andere auch zutreffen.
Es kann nicht nur eine Zutreffen

x*y <= z
x <= z/y
Allerdings muss y > 0, sonst kehrt sich doch das <= um^^
__________________
Be the source always with you.
ChiefWiggum ist offline   Mit Zitat antworten
Alt 24.11.09, 21:09   #7 (permalink)
 
Registriert seit: 25.06.06
0wnZ Leistung: Facit NTK
0wnZ eine Nachricht über ICQ schicken
Likes: 0
Standard

Für welchen Definitionsbereich ? Reelle Zahlen ?
Zunächst würde ich ich prüfen, ob eine der Zahlen größer ist als z (es sei denn es werden auch negative Zahlen zugelassen, dann müssen zusätzlich auch Vorzeichen geprüft werden). Sonst würde ich iwi "schummeln", dass man indirekt die Produkte erfährt. (=> Alles ohne Informatik bisher)
0wnZ ist offline   Mit Zitat antworten
Alt 24.11.09, 21:17   #8 (permalink)
Senior Member
 
Benutzerbild von sw33tlull4by
 
Registriert seit: 12.06.07
sw33tlull4by Leistung: Facit NTK
Likes: 0
Standard

AlterHacker:
Beide müssen ja nicht zutreffen, denn wer sagt das x*y<z gilt?
das soll ja gerade rausgefunden werden.
und ob x,y positiv oder negativ sind ist bei der betrachtungsweise egal.
@Ownz:
Das müssen die reellen zahlen sein, denn die operationen < und > sind nicht auf komplexen Zahlen definiert,der Betrag aber schon,und das ist eine reelle Zahl.
@threadstarter:
wie Ownz schon sagte ein paar infos mehr wären super
__________________
Nur die Schwachen klammern sich an die Moral.

Kill my daemons and my angels will follow them.

Geändert von sw33tlull4by (25.11.09 um 00:30 Uhr)
sw33tlull4by ist offline   Mit Zitat antworten
Alt 24.11.09, 21:25   #9 (permalink)
 
Benutzerbild von ChiefWiggum
 
Registriert seit: 09.10.07
ChiefWiggum Leistung: 8086
ChiefWiggum eine Nachricht über ICQ schicken
Likes: 11
Standard

Ich sag nur dass entweder beide zutreffen oder keins
__________________
Be the source always with you.
ChiefWiggum ist offline   Mit Zitat antworten
Alt 24.11.09, 21:30   #10 (permalink)
Senior Member
 
Benutzerbild von sw33tlull4by
 
Registriert seit: 12.06.07
sw33tlull4by Leistung: Facit NTK
Likes: 0
Standard

stimmt hast recht.
Denkfehler meinerseits, da war ich wohl etwas zu "unfaul".
__________________
Nur die Schwachen klammern sich an die Moral.

Kill my daemons and my angels will follow them.
sw33tlull4by ist offline   Mit Zitat antworten
Alt 24.11.09, 22:07   #11 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

Steh ich dann jetzt auf dem Schlauch?

Wenn ich x*y <= z habe, kann ich durch x oder y dividieren. Dabei muss ich aber eine Fallunterscheidung machen. Wenn sich durch die Division das Vorzeichen nur einer Seite ändert, muss ich die Beziehung umdrehen. Ändern sich die Vorzeichen auf beiden Seiten, bleibt alles wie gehabt.

Man erhält also für

- x>0, y>0 und ein beliebiges z
- x<0 y<0 und ein beliebiges z
- x<0 y>0 und z>0
- x>0 y<0 und z>0

x <= z/y bzw. y<= z/x

- x<0 y>0 und z>0

x <= z/y bzw. y >= z/x

- x>0 y<0 und z<0

x >= z/y bzw. y <= z/x

Das zeigt aber doch, dass jeweils beide Bedingungen zutreffen müssen und zusätzlich die Grundannahmen im Bezug auf die Vorzeichen, oder irre ich?
Thunderb0lt ist offline   Mit Zitat antworten
Alt 24.11.09, 23:07   #12 (permalink)
Themenstarter
 
Registriert seit: 12.01.09
lone.wolf Leistung: Z3
lone.wolf eine Nachricht über AIM schicken
Likes: 1
Standard

@Ownz:
D = R^+

Die Umformung ist schonmal ein guter Ansatz:

x * y <= z = x > z/y

Setzt man Werte ein, so sieht man schön, dass es passt.

Hat jemand noch andere Vorschläge?

MfG
lone.wolf ist offline   Mit Zitat antworten
Alt 25.11.09, 00:30   #13 (permalink)
Senior Member
 
Benutzerbild von sw33tlull4by
 
Registriert seit: 12.06.07
sw33tlull4by Leistung: Facit NTK
Likes: 0
Standard

Hi Thunderbolt.
- x>0, y>0 und ein beliebiges z
-Nein für müsste dann gelten z>0 damit die oben genannten Bedingungen
müssten erfüllt werden
- x<0 y<0 und ein beliebiges z
-gleicher fall wie oben
- x<0 y>0 und z>0
- x>0 y<0 und z>0
-in beiden Fällen kann z <0 sein,und solange die oben genannte
Bedingungen erfüllt sind ist die vorraussetzung dann wahr.
-sollte z sogar echt kleiner 0 sein, so sieht man leicht ein, das
bei richtiger Umstellung das Vorzeichen wegdividiert wird.
Weswegen die Unterscheidung nach Vorzeichen hier nicht von
belangen ist

mfg

sw33t
__________________
Nur die Schwachen klammern sich an die Moral.

Kill my daemons and my angels will follow them.
sw33tlull4by ist offline   Mit Zitat antworten
Alt 25.11.09, 01:18   #14 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard

Es gilt doch
log(xy)==log(x)+log(y)

Für negative Zahlen sollte eine Vorabgfrage und ggf. Normalisierung genügen (falls z negativ: x<0,y>0 oder y<0,x>0, falls z positiv: x,y<0 oder x,y>0). Technisch gesehen kann man darauf pfeifen - positiv oder negativ ist nur eine Sache der Interpretation der binären Darstellung *g*.

Btw:
Der "logarithmus" zur Basis 2 lässt sich trivial berechnen (bits zählen, Rest bilden - zuerst Anzahl der Bits (und damit die Potenzen) vergleichen und bei Bedarf noch die Reste). D.h man könnte auch ohne Logfunktion auskommen - alleine mit Potenzzerlegung und Addition.

Bsp zu der "Potenzzerlegung"
10*17<171
Zerlege in 2er Potenzen:

10=2^3 +2^1 (wie gesagt, einfaches Bitzählen/Bitabfragen zur Zerlegung genügt, man braucht keine Division oder Ähnliches)
17=2^4 +2^0
und
171=2^7 + 2^5+2^3+2^1+2^0

Ich schreibe mal weiter mit 2^, weil es die gewohnte Notation ist, allerdings sind die Basen gleich - daher reichen Exponenten schon für alle Operationen aus.

Die ganzen Multiplikationen werden bei Potenzen als Addition aufgefasst:
also "Kreuzmultiplikation" 17*10 = 2^4*2^3 + 2^4*2^1 + 2^1*2^0 + 2^3*2^0=
=2^(4+3)+2^(4+1)+2^(2+1)+2^(1+0) = 2^7+2^5+2^3+2^1
nun vergleiche die einzelnen Potenzstellen:
2^7+2^5+2^3+2^1 (+0*2^0)=170=10*17
||___||___||___| |
2^7+2^5+2^3+2^1+2^0 = 171
d.h 2^7=2^7 -> 7=7
2^5=2^5 -> 5=5 usw.

alle gleich, allerdings hat 171 noch 2^0 - das ist "mehr".
bei 170 wären
2^7+2^5+2^3+2^1 ==
2^7+2^5+2^3+2^1 (also gleich)
bei 10*17<169 hätte man
2^7+2^5+2^3+2^0=169
verglichen mit
2^7+2^5+2^3+2^1=170
=>falsch, da 2^1>1^0 -> 1>0

bei 192 =2^7+2^6 wäre man schon nach dem zweiten Vergelich fertig (da 2^6>2^5)

PS: es ist spät. kann sein, dass das Verfahren auch absoluter Humbug ist
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 25.11.09, 01:50   #15 (permalink)
Senior Member
 
Benutzerbild von sw33tlull4by
 
Registriert seit: 12.06.07
sw33tlull4by Leistung: Facit NTK
Likes: 0
Standard

Das ist echt clever.
Kleiner Verbesserungsvorschlag:
erhöhe die Stelle an welcher die Potenz steht um 1,
dh:
2^0 wird zu 1
2^5 wird zu 6
so vermeidest du das bei 2^0 das additive neutrale Element einbezogen wird.
und da du die erhöhung auf beiden seiten machst,solltest du auch vergleichbare werte bekommen, Bsp:
(170)10 = (10101010)2
(171)10 = (10101011)2

wenn du das nun erhöhst steht dort,wenn man nur die exponenten betrachtet und addiert:
1+3+6+7 = 17 für 170, das gleiche gilt auch für 171(0+1+3+6+7),
da bei 2^0 die 0 addiert wird.

jetzt erhöhen wir mal das alles um 1:
2+4+7+8 = 21 für 170
1+2+4+7+8 = 22 für 171
voilá.

mfg

sw33t
__________________
Nur die Schwachen klammern sich an die Moral.

Kill my daemons and my angels will follow them.
sw33tlull4by ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » X * y < z ?
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61