programm
-
Vertexwahn schrieb:
Für die Multiplikation gilt folgendes mathematische Gesetz
x * y = y + ((x-1)+y)stimmt gar nicht.
setzt mal ein, da kommt nicht das gleiche raus
-
Für die Multiplikation gilt folgendes mathematische Gesetz
und das hat welchen namen?
-
er meint vermutlich
a*b = a+ (b-1) [b]*[/b] a , b > 0 0 , b = 0
gilt natürlich nicht in besonders vielen Situationen, als Gesetz kenn ich das auch nicht ;).
-
a * b = a + a * b - a = a + a * ( b - 1 ) ziemlich trivial; wieso muss eigentlich alles, was rekursiv möglich ist, auch rekursiv gemacht werden ? :p
// z = x * y, x >= 0 for(int z=0;x--;z+=y);
-
wahrscheinlich, weil der compiler sowas dann intern wieder besser zu einem mul zusammenschieben kann
-
noch ne kleine anmerkung...
so ist multiplizieren arschlangsam...
besser ist es um die zahl um die im Faktor enthaltenen zweierpotzen zu shiften und den krempel auf zu addieren...
-
Windalf schrieb:
noch ne kleine anmerkung...
so ist multiplizieren arschlangsam...
besser ist es um die zahl um die im Faktor enthaltenen zweierpotzen zu shiften und den krempel auf zu addieren...das ist schon klar, siehe aber oben bzgl. einschränkunken verwendbarer operatoren...
-
@camper
also 1) Ich hab nur anmerkung geschrieben
2) haben einge von euch auch gegen die verstossen (ich hab nicht gesehen das ++i oder --i erlaubt ist...)
3)jetzt köntnest du zwar sagen ++i kann man auch durch i=i+1 abbilden...
ein shiften bzw. mit zwei multiplizieren kann man leicht abbilden indem man a=a+a verwendet... sind dann am ende immer noch weniger operation weil man z.b. für eine multiplikation mit 8 nur 3 mal a=a+a; schreiben mussPS: hatte ganz vergessen den Klugscheissmode anzuschalten...
-
hehe
[klugscheiss] - den linksshift operator kannst du noch durch addition ersetzen, bei rechtsshift wirds aber schwierig - (mit div wollen wir ja wohl kaum anfangen), während ++ bzw. -- direkt in addition bzw. subtraktion übergeht (zumindest im prefix).
die anmerkung ist aber insofern irrelevant, weil multiplikation nun mal am schnellsten geht, wenn man direkt multipliziert lol [/klugscheiss]
wie würde das denn aussehen... etwa so:
z=0; if ( x ) do { if ( x & 1 ) z += y; y <<= 1; } while ( x >>= 1 );
muss allerdings vorzeichenlos sein. und & brauch man auch noch - oder hat jemand einen besseren vorschlag ?
edit: nur mit linksshift gehts auch:
unsigned z = 0; unsigned temp = 1; if ( x ) do { if ( x & temp ) z = z + y; y = y + y; } while ( temp = temp + temp );
bleibt halt nur das hässliche &
-
ok - ich hab gelogen - ist gar kein mathematisches gesetzt und es gilt nur für Natürliche Zahlen