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(a∗x/b)⌉\lceil \log_2({a*x/b}) \rceil bzw. ⌊log2(a∗x/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,k∈Nb = 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_na−lognb\log\_n{\frac{a}{b}}=\log\_n{a}-\log_n{b}.

    Dann ergibt sich für jedes x∈Nx \in \mathbb{N} z.B.:
    ⌊log_2(axb)⌋=⌊log_2a+log_2x−log_2b⌋≥⌊log_2a⌋+⌊log_2x⌋−⌊log2b⌋\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 ax∣bax \mid b gilt, ist das Problem allerdings trivial gelöst. Bleibt noch der Fall ax∤bax \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_2x−log2b\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 k∈Nk \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 k∈Nk \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