Integer-Mathematik



  • Okay, gegeben seien die Funktionen log2x\lceil \log_2{x} \rceil und log2x\lfloor \log_2{x} \rfloor (x ist eine natürliche Zahl)

    Fällt euch auf Anhieb ein, wie man mit ihnen und reiner Integer-Arithmetik log2(ax/b)\lceil \log_2({a*x/b}) \rceil bzw. log2(ax/b)\lfloor log_2({a*x/b}) \rfloor ausrechnen kann? Also a und b sind auch natürliche Zahlen.



  • Okay, also irgendwie bin ich mir jetzt ziemlich sicher, dass ich den inneren Term aufrunden bzw. abrunden darf (bzw. in meinem Fall muss), ohne am Ergebnis etwas zu verändern.



  • Ich würde mal tippen, dass für hinreichend großes x, so ab x >= 1 gilt,
    dass

    log(x)log(x)\lfloor \log(x) \rfloor \le \log(\lfloor x \rfloor)
    und
    log(x)log(x)\log( \lceil x \rceil) \le \lceil \log(x) \rceil

    Andererseits unterscheiden sich offensichtlich log(x)\lfloor \log(x) \rfloor und log(x)\lceil \log(x) \rceil um höchstens 1. Das heißt, Du liegst nie weit daneben. Bestimmt reicht ein einzelner Test um rauszufinden welches der beiden Ergebnisse nun korrekt ist.



  • Wenn ich mich nicht irre, kannst du mit der Einschränkung b=2k,kNb = 2^k, k \in \mathbb{N} das machen:
    Allgemein gilt ja log_nab=log_na+lognb\log\_n{ab}=\log\_n{a}+\log_n{b} und log_nab=log_nalognb\log\_n{\frac{a}{b}}=\log\_n{a}-\log_n{b}.

    Dann ergibt sich für jedes xNx \in \mathbb{N} z.B.:
    log_2(axb)=log_2a+log_2xlog_2blog_2a+log_2xlog2b\lfloor \log\_2{(a\frac{x}{b})} \rfloor = \lfloor \log\_2{a} + \log\_2{x} -\log\_2{b}\rfloor \ge \lfloor \log\_2{a} \rfloor + \lfloor \log\_2{x} \rfloor - \lfloor \log_2{b} \rfloor, wobei nur letzteres berechnet werden kann.

    Wenn axbax \mid b gilt, ist das Problem allerdings trivial gelöst. Bleibt noch der Fall axbax \nmid b, dann ist ax=mb+rax = mb + r mit r<br \lt b, und damit insbesondere log_2(axb)=log_2(mb+rb)=log_2(mb+r)log_2b=log_2a+log_2xlog2b\log\_2{(a\frac{x}{b})} = \log\_2{(\frac{mb + r}{b})} = \log\_2{(mb+r)} - \log\_2{b} = \log\_2{a} + \log\_2{x} -\log_2{b}, also damit log_2a+log_2x=log2(mb+r)\lfloor \log\_2{a} + \log\_2{x} \rfloor = \lfloor \log_2{(mb+r)} \rfloor, wobei du die rechte Seite wieder leicht auswerten kannst.
    Wenn kNk \in \mathbb{N}, dann ist x+k=x+k\lfloor x + k \rfloor = \lfloor x \rfloor + k, also gilt log_2(axb)=log_2(mb+r)log2b\lfloor \log\_2{(a\frac{x}{b})} \rfloor = \lfloor \log\_2{(mb+r)} - \log_2 b \rfloor = log_2(mb+r)log_2b=log2(mb+r)k\lfloor \log\_2{(mb+r)} \rfloor - \lfloor \log\_2 b \rfloor = \lfloor \log_2{(mb+r)} \rfloor - k, wenn es kNk \in \mathbb{N} gibt, sodass b=2kb = 2^k gilt.



  • Whoah danke, hatte nicht mit der Ausführlichkeit gerechnet. Hoffentlich hattet ihr wenigstens etwas Freude an der Problemstellung!


Anmelden zum Antworten