To encourage use of existing j resources, sentences for divisors and a
perfect number test are in j phrases "numbers and counting".

http://www.jsoftware.com/docs/help701/phrases/numbers_counting.htm

Your factoring algorithm involves a common problem, that of reusing an
intermediate result within a tacit expression.  You recompute the
intermediate value.  Here is a solution similar to yours that stores the
intermediate vector.  Monad proper_divisors is explicit.  The tacit
solutions I can think of seem contrived.

   9!:7'+++++++++|-'

   NB. 22 won't be a divisor of 25
   possible_divisors =: [: >: [: i. [: <. -:

   possible_divisors&.>24 9
+--------------------------+-------+
|1 2 3 4 5 6 7 8 9 10 11 12|1 2 3 4|
+--------------------------+-------+

   proper_divisors=: 3 : 'pd #~ 0 = (pd=. possible_divisors y) | y'

   proper_divisors&.>24 9
+--------------+---+
|1 2 3 4 6 8 12|1 3|
+--------------+---+
   
   perfect=: = [: +/ proper_divisors

   (#~ perfect)}.i.200     NB.  OOPS!
|length error: proper_divisors
|   pd#~0=pd    |y[pd=.possible_divisors y

   (#~ perfect"0)}.i.200   NB. perfect needs to be rank 0
6 28

   perfect=: = ([: +/ proper_divisors)"0   NB. build in rank 0

   (#~ perfect)}.i.200           
6 28


Note that by using the built in factoring algorithms J can detect large
perfect numbers, whereas computing i.2305843008139952128x would consume
several scribes and a lot of papyrus.

   m70 2305843008139952128x
1



> Date: Tue, 9 Aug 2011 22:54:35 +0300
> From: Uriel Zylbermann <[email protected]>
> Subject: [Jprogramming] Hi, I'm new. monad on list length error
> To: [email protected]
> Message-ID:
>       <CAMA-M3kRKQ6uf-AzwLZE+=xyo-vf4pmxqwbg2rlejudeqe-...@mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
> 
> Hi, I'm new to J so my programs might be a bit more complicated than needed,
> I would be happy if you could tolerate that(and perhaps even give me fixes
> when needed).
> 
> anyway, I have a monad function that checks if a number is a perfect number:
> 
> (=([:+/((0=((|~)([:>:[:i.-&1)))#([:>:[:i.-&1))))


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to