Raul wrote: > And (* * #:@:|) achieves this result. I used (*@:] * (#.^:_1 |)) because if we're going to change #: , we need a consistent definition for all bases. (But I hear your implication that we are not going to change #: .)
Oh, and I just realized that my ab1 was not a faithful reproduction of Marshall's verb, so in my comments below, substitute his original for ab1 . Sorry about that! -Dan PS: Still bugs me that 2 #: y <==> 2 #.^:_1 y doesn't hold non-scalar y . It contradicts the dictionary, and makes discussions like this more difficult. For example, I want to be able to say *@:] * (#: |) is the radix-generalized equivalent of your binary * * #:@:| (i.e. the dyad to your monad), but it isn't. So I have to use circumlocutions like #.^:_1 . I reported this in 2006; maybe someone who's got the J source to build can fix it? http://www.jsoftware.com/jwiki/System/Interpreter/Bugs06#definitionofdyad.23.3Aincomplete -----Original Message----- From: programming-boun...@jsoftware.com [mailto:programming-boun...@jsoftware.com] On Behalf Of Raul Miller Sent: Monday, December 12, 2011 5:02 PM To: Programming forum Subject: Re: [Jprogramming] How #: should have been designed And (* * #:@:|) achieves this result. #. (* * #:@:|) i: 3 _3 _2 _1 0 1 2 3 That's probably good enough for now. -- Raul On Mon, Dec 12, 2011 at 4:34 PM, Dan Bron <j...@bron.us> wrote: > I don't think there's a violation of a uniqueness constraint. > > Consider: for a positive scalar argument y, then #:y is unique (trivially). > And, in the approach we're discussing, when the argument is negative, as in > #:-y, then the result is just -#:y . Therefore, #:-y is also unique, and > furthermore distinct from #:y. That is: the results of #: are always > strictly non-positive or non-negative. No individual result of #: will > contain both positive and negative digits. > > I also wouldn't mind your proposal of (#:-y) = _1 , #: y , but I think the > -#:y approach can claim some advantages. Given: > > ab0 =: *@:] * (#.^:_1 |) > ab1 =: (_1 * 0 > ]) ,"0 1^:(0~:+/@:[) #.^:_1 NB. Distilled from > your code > > We note first that ab0 is simpler than ab1. That means it's easier to > understand and implement (and debug). > > Second, the results of ab0 are easier to interpret. Knowing the definition > of both verbs, you could tell me what decimal number _1 _2 _3 represents on > sight, but with _1 8 7 7 you'd have to do some mental calculation (they both > represent the quantity _123). This advantage is cumulative when reasoning > about arrays of results (i.e., in J). > > Third, critically, the shape of ab0's results doesn't change with the sign > of its argument. This is important and valuable in a J context. For > example: > > _5 + 6 > 1 > _5 +&.(2&ab0 :. #.) 6 > 1 > _5 +&.(2&ab1 :. #.) 6 > |length error > | _5 +&.(2&ab1 :.#.)6 > > Moreover, this feature is particularly important for digit-arrays, because J > pads on the right, but in the positional number system, right-padding is > anathema. That is, prepending a _1 exacerbates a problem #: already has (by > allowing more opportunities for it to arise): > > my_array =: 2 ab1 3 2 1 > my_array =: my_array , 2 ab1 _1 _2 _3 > #. my_array > 6 4 2 _1 _2 _3 > NB. Ouch! Where'd my 3 2 1 go? > > Finally, I'd argue that the -#:y also makes intuitive sense: _123 means > "subtract one hundred, [subtract] two tens, and [subtract] three units". > Though this is subjective, it does allow one to reason about negative > numbers in a straightforward and expected way: > > _123 + 456 > 333 > _1 _2 _3 + 4 5 6 > 3 3 3 > 10 #. _1 _2 _3 + 4 5 6 > 333 > > _123 * 456 > _56088 > _1 _2 _3 * 456 > _456 _912 _1368 > 10 #. _1 _2 _3 * 456 > _56088 > > BTW, though I am using decimal examples, all these comments apply equally to > binary numbers, and every other base. > > -Dan > > -----Original Message----- > From: programming-boun...@jsoftware.com > [mailto:programming-boun...@jsoftware.com] On Behalf Of Marshall Lochbaum > Sent: Monday, December 12, 2011 2:55 PM > To: Programming forum > Subject: Re: [Jprogramming] How #: should have been designed > > The problem with this is that we would prefer not to use negative numbers > in antibase, since they can violate uniqueness of base representation. > There's really no solution to this--my recommendation is to just never feed > negative numbers to #: . However, an option that minimizes negative numbers > (and is very close to simply having two's complement base representation) > is to make the first digit negative if the number is negative. Thus #: > becomes > base =. [: |."_1@:> |.@(#:`(_1,#:)@.(<&0))&.> > Basically, use J's #: , and prepend a _1 if the input is negative. Then > reverse, box, open everything for fill, and reverse again. > > base i:5 > _1 0 1 1 > _1 1 0 0 > 0 _1 0 1 > 0 _1 1 0 > 0 0 _1 1 > 0 0 0 0 > 0 0 0 1 > 0 0 1 0 > 0 0 1 1 > 0 1 0 0 > 0 1 0 1 > #. base i:5 > _5 _4 _3 _2 _1 0 1 2 3 4 5 > > Marshall > > On Mon, Dec 12, 2011 at 2:09 PM, Dan Bron <j...@bron.us> wrote: > >> Maybe we should explore a different track. Forget all about the history > of >> computing hardware, and the advantages of one representation over another >> when designing circuits. In purely mathematical terms, what are the >> decimal >> digits of the base-10 number -123 ? >> >> Working backwards: >> >> _123 NB. begin >> -123 NB. notation->operation >> _1 * 123 NB. definition of - >> _1 * (1 * 10^2) + (2 * 10^1) + ( 3 * 10^0) NB. positional number >> notation >> (_1 * 10^2) + (_2 * 10^1) + (_3 * 10^0) NB. distribution of * over > + >> _1 _2 _3 +/ . * 10^2 1 0 NB. array simplification >> 10 #. _1 _2 _3 NB. definition of #. >> >> Thus, to satisfy the purposes of inversion, we should have: >> [all examples from here on are purely theoretical, and the >> results differ in the extant implementations of J]: >> >> 10 #.^:_1: _123 >> _1 _2 _3 >> >> And, analogously in base 2: >> >> 2 #.^:_1: 2b_101 NB. 2b_101 is J's notation >> for -101 in base 2 >> _1 0 _1 >> #: 2b_101 NB. #: <=> 2&#.^:_1: >> _1 0 _1 >> #: _5 NB. _5 <=> 2b_101 (numbers >> are analytic) >> _1 0 _1 >> >> QED.* >> >> -Dan >> >> * Backwards compatibility notwithstanding >> >> PS: What implications does this have for modulus, as in _10 | 123 ? >> >> >> ---------------------------------------------------------------------- >> 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