• Re: myrkraverk.c

    From Johann \@johann@myrkraverk.invalid to comp.lang.python,comp.lang.c,sci.math,sci.crypt on Sun Sep 20 22:09:56 2026
    From Newsgroup: sci.crypt

    On 9/20/2026 9:48 PM, Stefan Ram wrote:
    "Johann \"Myrkraverk\" Oskarsson" <johann@myrkraverk.invalid> wrote or quoted:
    Perhaps I should have made that clearer in the code comments?

    No, I was too focused on just that one line,
    not paying attention to the global context.

    A bit more worrying is that I do not off hand know how to time my cre-
    ation. This is because /timeit/ can't find it.

    Maybe you can pass the globals which should contain the name
    "count_lsb":

    timeit.timeit("count_lsb(1 << 125)", globals=globals())

    . The optional "globals" argument specifies a namespace in
    which to execute the code.

    You could also try the pattern,

    start_time = timeit.default_timer()
    count_lsb(1<<125)
    dt = timeit.default_timer() - start_time

    . However, when "count_lsb(1<<125)` is very fast, the results
    might be less accurate. (You can ask your chatbot about
    "pitfalls of microbenchmarks in Python".)

    Thank you, but the following Python session demonstrates the efforts of
    my work, and that it is indeed significantly faster than the /tradition-
    al/ method.

    n = 1 << 125000
    ( n & -n ).bit_length() - 1
    125000
    def lsb( n ):
    ... return ( n & -n ).bit_length() - 1
    ...
    timeit.timeit( "lsb( n )", globals=globals() )
    3.679828499996802
    timeit.timeit( "lsb( n )", globals=globals() )
    3.6671537999936845
    timeit.timeit( "lsb( n )", globals=globals() )
    3.677232099988032
    timeit.timeit( "count_lsb( n )", globals=globals() )
    0.8524350000079721
    timeit.timeit( "count_lsb( n )", globals=globals() )
    0.8531503000122029
    timeit.timeit( "count_lsb( n )", globals=globals() )
    0.8298240999865811
    timeit.timeit( "count_lsb( n )", globals=globals() )
    0.8146453999797814

    ## So now we have actual numbers to work with. The following snapshot
    ## demonstrates that my effort is approximately 1/5th to 1/4th of the
    ## /original/ in a worst case kind of situation.

    print( 0.8146453999797814 / 3.677232099988032 )
    0.22153766143356377

    ## A proper statistician would of course use averages of multiple runs
    ## of both versions, but I'm sloppy with statistics. After all, I can
    ## demonstrate that my method is faster, and not slower, and don't have
    ## to mess about with the benchmark to give a false impression.

    ## Of course, I do not know how much of a benefit this is, when it comes
    ## to real world cryptography, as I have only a very limited set of num-
    ## bers from Cryptohack so far. The real test will be in making my own
    ## Jacobi Symbol function, and benchmark against the one in SymPy.

    ## I have added sci.math, and sci.crypt, in case they want to comment on
    ## what kind of real world numbers are typically put through a Jacobi
    ## Symbol function, when doing cryptographic research.


    ## Best wishes, and happy cryptography with Python!
    --
    Johann | email: invalid -> com | http://www.myrkraverk.com/blog/
    I'm not from the Internet, I just work there. | via Easynews.com https://bsky.app/profile/myrkraverk.bsky.social | for ( ;; ) _:;
    --- Synchronet 3.22a-Linux NewsLink 1.2