Some routines to calculate permutation and combination numbers, similar to A. 
(but allows permutations with repeat)

del1 =: i.~ ({. , >:@[ }. ]) ]

combN =: (0:`((<:@[ - {.@]) $: >:@{.@] -~ }.@])@.(0 < #@]) + 0:`(<:@#@] +/@:! 
<:@[ - i.@{.@])@.(0 < {.@]) )

combNF =: 3 : 'a =. 1 { 0 {:: y label_. (i.a) + +/\ 1 {:: ([ (] ;~ [ -  1 ,~ _2 
>:@{ ]) }:@] , {:@] ([ ({.@] ,(- {:)) ] (] , {~) 1 i:~ >:) (0 , ] (+/\)@:! ( a 
i.@:-~ [) -~ [)/@:<:@[ )&>/^: (<:a) y'@:;

permC =: # %&(x:@:(*/))&:! #/.~

permN1 =: ((0:`( (] - <./)@:({.@] del1 [)  $: (] - <./)@:}.@] )@.(1 < #@])) + 
(permC % #)@] * [ i.  {.@] ) f.

permN =: /:~ permN1 ]

  100x  combN   15 25 35 45 55 65 85
11284989655

  100 7 combNF  11284989655x
15 25 35 45 55 65 85

  permN 1 0 0 2 1 3 3 1
434

haven't done the reverse to permN yet, but these routines combined can be used 
to compress any list into 2 numbers (with a key).  You can google for 
combinatorial number base, and there is A., but not sure A. has been done for 
permutations with repeats.  Which produces smaller numbers than A. does (due to 
fewer underlying permutations).
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to