Kip, I get a different result from  tc  than you show in your original post.
Using J  I get:

   tc =: #:~2 #~ [:>./ 1 + [:>. (2 ^. |)`(2 ^.>:)@.(0<: ])"0
   ]a=:tc i:6
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 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
0 1 1 0

This is copied from your post:

The verb tc (two's complement) appears to work

     tc =: #:~ 2 #~ [: >./ 1 + [: >. (2 ^. |)`(2 ^. >:)@.(0 <: ])"0

     twoscomplement i: 6
  0 1 0
  0 1 1
  1 0 0
  1 0 1
  1 1 0
  1 1 1
  0 0 0
  0 0 1
  0 1 0
  0 1 1
  1 0 0
  1 0 1
  1 1 0

Call this b:

   ]b=: }."1 a
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0

 c=:#:i:6
   c
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
   (}."1 tc i:6)-:(#:i:6)
1
   b-:c
1
    tcinv=:[: #. (* (_1 ^ 0= i.@#))"1
    tcinv a
_6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6
   
   tcinv b
2 3 _4 _3 _2 _1 0 1 2 3 _4 _3 _2

So I thought you  really meant the four column result in  a  .

However the array in  b matches the result of using  #: on  i:

   ]c=:#:i:6
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
  
   b-:c
1

   No matter if it was created by #: or by  tc  , it is an array of unique
numbers.  It only represents the following list.
  
    #.b
2 3 4 5 6 7 0 1 2 3 4 5 6
   #.c
2 3 4 5 6 7 0 1 2 3 4 5 6

This is incorrect.

Now consider:

   (8+i.15)-15#15
_7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7

   d=:(#:8+i.15)-((5#2)#:,15#15)
   d
0  0 _1 _1 _1
0  0 _1 _1  0
0  0 _1  0 _1
0  0 _1  0  0
0  0  0 _1 _1
0  0  0 _1  0
0  0  0  0 _1
0  0  0  0  0
1 _1 _1 _1 _1
1 _1 _1 _1  0
1 _1 _1  0 _1
1 _1 _1  0  0
1 _1  0 _1 _1
1 _1  0 _1  0
1 _1  0  0 _1

The array in  d is a beautiful representation of negative binary numbers.  
They include negative signs. If the leftmost digit is negative, the number
is negative.  Look only at the top and if you recognize the pattern as 5 it
will 
Be negative  5

The array follows traditional place value.
  
  |.2^i.5
16 8 4 2 1

   d*($d)$|.2^i.5
 0  0 _4 _2 _1
 0  0 _4 _2  0
 0  0 _4  0 _1
 0  0 _4  0  0
 0  0  0 _2 _1
 0  0  0 _2  0
 0  0  0  0 _1
 0  0  0  0  0
16 _8 _4 _2 _1
16 _8 _4 _2  0
16 _8 _4  0 _1
16 _8 _4  0  0
16 _8  0 _2 _1
16 _8  0 _2  0
16 _8  0  0 _1

   +/"1  d*($d)$|.2^i.5
_7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7

And the sum of the value of the digits is correct.  Furthermore,  #.
Understands it with no change in code.

   #.d
_7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7
       
   
My contention is that if we, the users, could get used to negative numbers,
as we have learned to like  _123.132j432.23 we would embrace these six
binary representations:
  
   f=:0,.0,.(?6 7$3){_1 0 1
   f
0 0 _1  1  1  0 _1 _1  1
0 0  1 _1  0  1  1 _1  0
0 0  0 _1 _1 _1 _1  1 _1
0 0  0  0 _1  1  0  0  1
0 0  1  0 _1 _1  0  0  0
0 0  1 _1  1 _1  1  0  1

The two columns of  0's  are necessary for this to work correctly.

Using place value and J we can "read" these numbers correctly

   f*($f)$|.2^i.9

0 0 _64  32  16  0 _4 _2  1
0 0  64 _32   0  8  4 _2  0
0 0   0 _32 _16 _8 _4  2 _1
0 0   0   0 _16  8  0  0  1
0 0  64   0 _16 _8  0  0  0
0 0  64 _32  16 _8  4  0  1

   +/"1 f*($f)$|.2^i.9
_21 42 _59 _7 40 45

 And with no change in code,  #.  Gives the same results
   
   #.f
_21 42 _59 _7 40 45

It is only  #:  that must be changed. I would think this would be fairly
straightforward if these representatives of negative binary numbers were
adopted.   

   #:#.f

1 1 1 1 1 0 0
0 1 0 0 0 1 0
0 1 1 1 1 0 1
1 0 1 0 0 1 0
0 1 1 1 0 1 1
1 1 0 0 0 1 0

Since the current representation that  #: provides has only positive numbers
it is where the changes are necessary.
  
Finally ou would never see the displays above if  you only consider positive
integers.
   
   ]e=:#:i.7
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
   #.e
0 1 2 3 4 5 6
   
So, my take on this is that the user must learn to accept a new way of
understanding of what binary numbers look like.  They will be unique. You
can identify the sign by the leading element. If you can read the number in
binary, it will be the same number but negative.

I keep trying to explain, and as I do it is getting easier for me to
understand what I am saying.  That's I guess how you learn, by trying to
teach.

Linda

  
   






-----Original Message-----
From: programming-boun...@jsoftware.com
[mailto:programming-boun...@jsoftware.com] On Behalf Of Kip Murray
Sent: Friday, December 16, 2011 1:53 PM
To: Programming forum
Subject: Re: [Jprogramming] How #: should have been designed

You need to use Marshall's two's complement inverse

     tcinv
  [: #. (* (_1 ^ 0 = i.@#))"1
     tcinv tc i: 6
  _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6

In emails I insert an extra space in front of J output -- this seems to 
protect it from the vagaries of email.

I will look at your post, thanks for repeating it.

On 12/16/2011 2:40 AM, Linda Alvord wrote:
> Here's what I get.  The line will split but when I paste it back together:
>
>      tc =: #:~ 2 #~ [:>./ 1 + [:>. (2 ^. |)`(2 ^.>:)@.(0<: ])"0
>     ]a=:tc i:6
> 1 0 1 0
> 1 0 1 1
> 1 1 0 0
> 1 1 0 1
> 1 1 1 0
> 1 1 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
> 0 1 1 0
>     #.a
> 10 11 12 13 14 15 0 1 2 3 4 5 6
>
> Not good. But your display does not have the first column, so maybe you
need
> to post the function again.
>
> I tried to remove the first column to match your dislay:
>
>     ]b=:1}."1 a
> 0 1 0
> 0 1 1
> 1 0 0
> 1 0 1
> 1 1 0
> 1 1 1
> 0 0 0
> 0 0 1
> 0 1 0
> 0 1 1
> 1 0 0
> 1 0 1
> 1 1 0
>
>     #.b
> 2 3 4 5 6 7 0 1 2 3 4 5 6
>
> This is also not working.
>
> Did you really read my post in a reply to a message to Devon? I'll repeat
it
> here as I am interested in your comments:
>
>     ]a=:8+i.15
> 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
>     ]b=:15#15
> 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15
>     ]c=:a-b
> _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7
>     f=: 13 :'(x#2)#:y'
>     f
> ] #:~ 2 #~ [
>
> The function f converts the lists to binary numbers.  The largest number
22
> is less than  32  so only  5  digits are require.
>
>    ]aa=:5 f a
> 0 1 0 0 0
> 0 1 0 0 1
> 0 1 0 1 0
> 0 1 0 1 1
> 0 1 1 0 0
> 0 1 1 0 1
> 0 1 1 1 0
> 0 1 1 1 1
> 1 0 0 0 0
> 1 0 0 0 1
> 1 0 0 1 0
> 1 0 0 1 1
> 1 0 1 0 0
> 1 0 1 0 1
> 1 0 1 1 0
>
>     ]bb=:5 f b
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
> 0 1 1 1 1
>
>   The result below is the difference in  J  between the two arrays above.
It
> is not a conversion using  #:
>
>     ]cc=:aa-bb
> 0  0 _1 _1 _1
> 0  0 _1 _1  0
> 0  0 _1  0 _1
> 0  0 _1  0  0
> 0  0  0 _1 _1
> 0  0  0 _1  0
> 0  0  0  0 _1
> 0  0  0  0  0
> 1 _1 _1 _1 _1
> 1 _1 _1 _1  0
> 1 _1 _1  0 _1
> 1 _1 _1  0  0
> 1 _1  0 _1 _1
> 1 _1  0 _1  0
> 1 _1  0  0 _1
>
> For comparison, the result  cc2  is obtained  as a  J  result using  #:
>     ]cc2=: 5 f c
> 1 1 0 0 1
> 1 1 0 1 0
> 1 1 0 1 1
> 1 1 1 0 0
> 1 1 1 0 1
> 1 1 1 1 0
> 1 1 1 1 1
> 0 0 0 0 0
> 0 0 0 0 1
> 0 0 0 1 0
> 0 0 0 1 1
> 0 0 1 0 0
> 0 0 1 0 1
> 0 0 1 1 0
> 0 0 1 1 1
>
> Or:
>
>    ]cc3=:#:c
> 0 0 1
> 0 1 0
> 0 1 1
> 1 0 0
> 1 0 1
> 1 1 0
> 1 1 1
> 0 0 0
> 0 0 1
> 0 1 0
> 0 1 1
> 1 0 0
> 1 0 1
> 1 1 0
> 1 1 1
>
> Both cc2 and cc3 seem implausible because all numbers are known positive
> numbers. Now look at  cc :
>
>     w=: 13 :'(x,y)$|.2^i.y'
>     w
> , $ [: |. 2 ^ [: i. ]
>     15 w 5
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
> 16 8 4 2 1
>
>     cc*15 w 5
>   0  0 _4 _2 _1
>   0  0 _4 _2  0
>   0  0 _4  0 _1
>   0  0 _4  0  0
>   0  0  0 _2 _1
>   0  0  0 _2  0
>   0  0  0  0 _1
>   0  0  0  0  0
> 16 _8 _4 _2 _1
> 16 _8 _4 _2  0
> 16 _8 _4  0 _1
> 16 _8 _4  0  0
> 16 _8  0 _2 _1
> 16 _8  0 _2  0
> 16 _8  0  0 _1
>
>
>     +/"1 cc*15 w 5
> _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7
>
> This is c!
>
> Not only that,  J  knows it is c.
>
>     #.cc
> _7 _6 _5 _4 _3 _2 _1 0 1 2 3 4 5 6 7
>
> So what do you think?
>
> Linda
>
> -----Original Message-----
> From: programming-boun...@jsoftware.com
> [mailto:programming-boun...@jsoftware.com] On Behalf Of Kip Murray
> Sent: Friday, December 16, 2011 2:43 AM
> To: Programming forum
> Subject: Re: [Jprogramming] How #: should have been designed
>
> The verb tc (two's complement) appears to work
>
>       tc =: #:~ 2 #~ [:>./ 1 + [:>. (2 ^. |)`(2 ^.>:)@.(0<: ])"0
>
>       twoscomplement i: 6
>    0 1 0
>    0 1 1
>    1 0 0
>    1 0 1
>    1 1 0
>    1 1 1
>    0 0 0
>    0 0 1
>    0 1 0
>    0 1 1
>    1 0 0
>    1 0 1
>    1 1 0
>
>       tc i: 6
>    1 0 1 0
>    1 0 1 1
>    1 1 0 0
>    1 1 0 1
>    1 1 1 0
>    1 1 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
>    0 1 1 0
>
>
> On 12/15/2011 12:52 PM, Kip Murray wrote:
>> twoscomplement i: 4 NB. error
>> 1 0 0
>> 1 0 1
>> 1 1 0
>> 1 1 1
>> 0 0 0
>> 0 0 1
>> 0 1 0
>> 0 1 1
>> 1 0 0
>>
>> rp =: [: }: [: i: 2 ^<: NB. representable in y bits
>>
>> rp 3
>> _4 _3 _2 _1 0 1 2 3
>>
>> twoscomplement rp 3 NB. OK
>> 1 0 0
>> 1 0 1
>> 1 1 0
>> 1 1 1
>> 0 0 0
>> 0 0 1
>> 0 1 0
>> 0 1 1
>>
>>
>> On 12/14/2011 9:13 AM, Raul Miller wrote:
>>> The subject line of this thread is arguably wrong -- there are a
>>> variety of "good ways" of decomposing integers to binary.
>>>
>>> That said, it's interesting to think about the various proposals
>>> expressed in terms similar to those which could be used to implement
>>> monadic #:
>>>
>>> antibase2=: #:~ 2 #~ 1 + 2<.@^. 1>.>./@,@:|@:<.
>>> twoscomplement=: #:~ 2 #~ 1 + 2<.@^. 1 +>./@,@:|@:<.
>>> signwithbits=: #:~ 0, 2 #~ 1 + 2<.@^. 1>.>./@,@:|@:<.
>>>
>>> (In all cases the #: here is dyadic, so these definitions are
>>> independent of the definition of monadic #:)
>>>
>>> antibase2 i: 3
>>> 0 1
>>> 1 0
>>> 1 1
>>> 0 0
>>> 0 1
>>> 1 0
>>> 1 1
>>> twoscomplement i: 3
>>> 1 0 1
>>> 1 1 0
>>> 1 1 1
>>> 0 0 0
>>> 0 0 1
>>> 0 1 0
>>> 0 1 1
>>> signwithbits i: 3
>>> _1 0 1
>>> _1 1 0
>>> _1 1 1
>>> 0 0 0
>>> 0 0 1
>>> 0 1 0
>>> 0 1 1
>>>
>>> There's also (* * #:) but that one assumes the antibase2
>>> implementation...
>>>
> ----------------------------------------------------------------------
> 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