That's an impressive performance gain from (f.).

Thanks,

-- 
Raul

On Sun, Sep 6, 2015 at 11:04 AM, Jose Mario Quintana
<jose.mario.quint...@gmail.com> wrote:
> Raul writes:
>
>>>> Honestly, though, I prefer the explicit version. It's simpler, more
>>>> concise, and faster. But I think that that is more a direct
>>>> consequence of the (somewhat arbitrary) design of the algorithm than
>>>> anything else.
>
> I do not see much difference in performance; if anything, a fixed tacit
> version is faster (and leaner).
>
>    st=. (, */&.:>@:(1 2&{))@:(] ; 7!:2@:] ; 6!:2)
>
>    666 st&>'emix i.8' ; 'tmix i.8'
> ┌────────┬─────┬──────────┬────────┐
> │emix i.8│11520│7.28718e_5│0.839483│
> ├────────┼─────┼──────────┼────────┤
> │tmix i.8│9600 │7.62123e_5│0.731638│
> └────────┴─────┴──────────┴────────┘
>
>    AND=. 17 b./ :(17 b.)
>    XOR=. 22 b./ :(22 b.)
>    fmix=. tmix f.
>
>    666 st&>'emix i.8' ; 'tmix i.8' ; 'fmix i.8'
> ┌────────┬─────┬──────────┬────────┐
> │emix i.8│11520│7.13917e_5│0.822432│
> ├────────┼─────┼──────────┼────────┤
> │tmix i.8│9600 │7.49109e_5│0.719145│
> ├────────┼─────┼──────────┼────────┤
> │fmix i.8│9600 │4.12386e_5│0.39589 │
> └────────┴─────┴──────────┴────────┘
>
>    ,.@:(emix ; tmix ; fmix) i.8
> ┌────────────────────────────────────────────────────────────────────┐
> │68112070 67580715 540296643 2058 539239185 529307 67580712 539769534│
> ├────────────────────────────────────────────────────────────────────┤
> │68112070 67580715 540296643 2058 539239185 529307 67580712 539769534│
> ├────────────────────────────────────────────────────────────────────┤
> │68112070 67580715 540296643 2058 539239185 529307 67580712 539769534│
> └────────────────────────────────────────────────────────────────────┘
>
>
> On Sat, Sep 5, 2015 at 8:29 PM, Raul Miller <rauldmil...@gmail.com> wrote:
>
>> Meh... I misremembered when I wrote this: this was wrong. Sorry about that.
>>
>> --
>> Raul
>>
>> On Sat, Sep 5, 2015 at 8:24 PM, Raul Miller <rauldmil...@gmail.com> wrote:
>> > Oops, I should have included example uses.
>> >
>> > umix is a dyad - you need to give it a left argument saying how many
>> > times you want it to run.
>> >
>> > Try:
>> >    1 umix i.8
>> >
>> > emix would need another loop (or a power conjunction) to achieve the
>> same thing.
>> >
>> > Thanks,
>> >
>> > --
>> > Raul
>> >
>> >
>> > On Sat, Sep 5, 2015 at 7:00 PM, Jose Mario Quintana
>> > <jose.mario.quint...@gmail.com> wrote:
>> >>    emix i.8
>> >> 68112070 67580715 540296643 2058 539239185 529307 67580712 539769534
>> >>
>> >>    umix i.8
>> >> |length error: SH
>> >> |       umix i.8
>> >> |[-23]
>> >>
>> >> ?
>> >>
>> >>
>> >> On Sat, Sep 5, 2015 at 10:50 AM, Raul Miller <rauldmil...@gmail.com>
>> wrote:
>> >>
>> >>> Nice.
>> >>>
>> >>> Except, I prefer shift to take the number of bits as a left argument.
>> >>> Also, there's still the matter of doing it tacitly.
>> >>>
>> >>> So, here's my rephrasing of your excellent work, for the explicit mix:
>> >>>
>> >>> top=: <:2^32
>> >>> SH =: top AND 34 b. NB. 32 bit shift
>> >>> MP =: top AND + NB. 32 bit addition ("modplus")
>> >>>
>> >>> emix =: verb define
>> >>>   for_j. 11 _2 8 _16 10 _4 8 _9 do.
>> >>>     'a b c d e f g h' =. y
>> >>>     i=. a XOR j SH b
>> >>>     y =. (b MP c), c, (d MP i), e, f, g, h, i
>> >>>   end.
>> >>> )
>> >>>
>> >>> And, here is a tacit equivalent:
>> >>>
>> >>> rfold=: 1 :'u&.>/@,&.:(<"_1),:'
>> >>> tmix=:  _9 8 _4 10 _16 8 _2 11 umix rfold ]
>> >>> imix=: 1 }. ], (0,[) XOR/@SH 2 {. ]
>> >>> ymix=: MP/ .*&(8 8$1(8 58}),=i.8)
>> >>> umix=: ymix@imix
>> >>>
>> >>> Honestly, though, I prefer the explicit version. It's simpler, more
>> >>> concise, and faster. But I think that that is more a direct
>> >>> consequence of the (somewhat arbitrary) design of the algorithm than
>> >>> anything else.
>> >>>
>> >>> Thanks,
>> >>>
>> >>> --
>> >>> Raul
>> >>>
>> >>> On Sat, Sep 5, 2015 at 12:33 AM, Michal Wallace
>> >>> <michal.wall...@gmail.com> wrote:
>> >>> > It's just a hashing algorithm, mixing up the bits of data in a
>> >>> > deterministic but irreversible way.
>> >>> >
>> >>> > If you notice that the "alphabet-distance" between the variable
>> names on
>> >>> > each line is always the same,
>> >>> > my implementation might make more sense. Since the offsets are
>> always the
>> >>> > same, I'm just rotating the
>> >>> > array and re-applying the same logic.
>> >>> >
>> >>> > Here's the c code that will tell us what the result should be for mix
>> >>> i.8:
>> >>> >
>> >>> > #include <stdio.h>
>> >>> > int main() {
>> >>> >    int a,b,c,d,e,f,g,h;
>> >>> >    a=0;b=1;c=2;d=3;e=4;f=5;g=6;h=7;
>> >>> >    a^=b<<11; d+=a; b+=c;
>> >>> >    b^=c>>2;  e+=b; c+=d;
>> >>> >    c^=d<<8;  f+=c; d+=e;
>> >>> >    d^=e>>16; g+=d; e+=f;
>> >>> >    e^=f<<10; h+=e; f+=g;
>> >>> >    f^=g>>4;  a+=f; g+=h;
>> >>> >    g^=h<<8;  b+=g; h+=a;
>> >>> >    h^=a>>9;  c+=h; a+=b;
>> >>> >          // a  b  c  d  e  f  g  h
>> >>> >    printf("%d %d %d %d %d %d %d %d\n", a,b,c,d,e,f,g,h);
>> >>> > }
>> >>> >
>> >>> > Answer:
>> >>> >
>> >>> > 68112070 67580715 540296643 2058 539239185 529307 67580712 539769534
>> >>> >
>> >>> > Here's the corrected code:
>> >>> >
>> >>> > top=: <:2^32
>> >>> >
>> >>> > SH =: top AND (34 b.)~ NB. 32 bit shift
>> >>> >
>> >>> > MP =: top AND + NB. 32 bit addition ("modplus")
>> >>> >
>> >>> > mix =: verb define
>> >>> >
>> >>> >   for_i. 11 _2 8 _16 10 _4 8 _9 do.
>> >>> >
>> >>> >     'a b c d e f g h' =. y
>> >>> >
>> >>> >     x =. a XOR b SH i
>> >>> >
>> >>> >     y =. 1 |. x, (b MP c), c, (d MP x), e, f, g, h
>> >>> >
>> >>> >   end.
>> >>> >
>> >>> > )
>> >>> >
>> >>> >
>> >>> > assert (mix i.8) -: 68112070 67580715 540296643 2058 539239185 529307
>> >>> > 67580712 539769534
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>> > On Fri, Sep 4, 2015 at 10:34 PM, Dan Bron <j...@bron.us> wrote:
>> >>> >
>> >>> >> Michal Wallace wrote:
>> >>> >> > I don't know whether or not this produces the correct results
>> because
>> >>> I
>> >>> >> > don't have any test data, but...
>> >>> >>
>> >>> >>
>> >>> >> Yeah, that is troublesome.  Unfortunately, it’s the same catch-22
>> I’m
>> >>> in.
>> >>> >>
>> >>> >> I’m transliterating the C code here:
>> >>> >>
>> >>> >> http://rosettacode.org/wiki/The_ISAAC_Cipher#C <
>> >>> >> http://rosettacode.org/wiki/The_ISAAC_Cipher#C>
>> >>> >>
>> >>> >> as directly as possible into J, so that I can get a working program
>> >>> which
>> >>> >> produces the expected outputs for the given inputs.
>> >>> >>
>> >>> >> Once I have a working program that I can test, interrogate, and
>> reason
>> >>> >> about, I’ll be in a much better position to refactor the code into
>> >>> >> idiomatic, and, hopefully, elegant J.
>> >>> >>
>> >>> >> But the very reason I have to do it this cart-before-horse way is
>> >>> because
>> >>> >> I don’t (yet) understand the algorithm on a conceptual level.  So
>> I’m
>> >>> >> starting from the code.
>> >>> >>
>> >>> >> I guess what I was asking for in my previous email was for someone
>> who
>> >>> >> does or can easily grok the concepts underlying the code to express
>> >>> them in
>> >>> >> J (which is a language I speak, so such code would teach me those
>> >>> concepts).
>> >>> >>
>> >>> >> Barring that, someone who is confident enough in his C to trust in
>> his
>> >>> >> translation of the macro would also suffice.
>> >>> >>
>> >>> >> (One big obstacle here, and I think more broadly to the lack of
>> adoption
>> >>> >> of ISAAC the author of that article laments is the majority of
>> >>> >> easily-accessible artifacts dealing with it are code, rather than
>> >>> prose.)
>> >>> >>
>> >>> >> -Dan
>> >>> >>
>> ----------------------------------------------------------------------
>> >>> >> For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >>> >>
>> >>> >
>> ----------------------------------------------------------------------
>> >>> > For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >>> ----------------------------------------------------------------------
>> >>> For information about J forums see http://www.jsoftware.com/forums.htm
>> >>>
>> >> ----------------------------------------------------------------------
>> >> For information about J forums see http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to