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