I’ve worked up a number of variant explicit partition functions. One of these 
is mpart;  
m mpart n yields all m-partitions of n,  with no zeros, but allowing repeats. 

So, for example, using a smallish example:
      3 mpart 7.  NB.  there are four 3-partitions of 7
3 2 2
3 3 1
4 2 1
5 1 1

This can lead to all 3-partitions of 10 excluding repeats as follows:
   2 1 0 + "1] 3 mpart 7. NB. add I.-3 to 3-partitions of 7=10-3
5 3 2
5 4 1
6 3 1
7 2 1
   (#~ 3=#@~."1) 3 mpart 10 NB. naive way, filter 3-partitions of 10 for 
non-repeats
5 3 2
5 4 1
6 3 1
7 2 1

Count numbers of m-partitions of 7 for m = 1,7:
   (>:i. 7)#@ mpart"0]7
1 3 4 3 2 1 1

Here, however, you want 7-partitions of 100 without repeats, which can be 
derived from 
7-partitions of 79 = 100- +/ I.7 

Perhaps surprisingly, mpart does manage to cope with this size of problem:
   #7 mpart 79
108869

You’ll find essays on partitions at J Wiki, including partition counting 
functions, pnkv and pnkd.
This is somewhat quicker than my constructive verb:
   {:7 pnkd~ 79
108869

Note that these both count partitions excluding zero elements, whereas your odo 
appears to include zeros.  Since you require all elements different, I suppose 
you might wish to include 6-partitions as well. I won’t attempt that here.

I’ll list my mpart and pnkd, which I think was one of Roger’s offerings:

NB. my function for m-partitions of n where x = m & n = y
mpart =: 3 : 0
:
m =. x [ n =. y
NB. smoutput m;n
if. m = 1 do. ,: n  return. end.
max =. n + 1 - m
min =. >.n%m
l   =. ,.min ([+i.@>:@-~ ) max
for_j. >:}:}. i.m do.
  rem =. n - +/"1 l
  min =. >. rem%(m + 1 - j) 
  max =. min >. ({:"1 l) <. rem - m - j
  nl  =. 0-.~, min ([+i.@>:@-~ )"0 max
  l   =. nl,.~ l#~1 + max - min
end.
l,. n - +/"1 l
)

NB. If n pnk k is the number of partitions of n with largest part k , 
NB. or equivalently, the number of partitions of n with k parts, then 
NB. pnk satisfies the recurrence relation:
NB. (n pnk k) = ((n-1) pnk k-1) + (n-k) pnk k
NB.
NB. partition number functions 
NB. The following function computes the number of partitions for 
(k,k),...,(n,k) 
NB. and has a very different time-space model than pnkv. 
NB. It is very fast at k approaching n but loses to pnkv in performance for 
small k.
NB. n pnkd k : for [k,n] efficient for large k
pnkd=: 4 : 0    
  m=. y <. s=. x-y
  t=. >:i.s
  p=. 1,s$0x
  for_i. >:i.m do.
    for_j. (<:i)}.t do. p=. (+/(j,j-i){p)j}p 
    end. 
  end.
)

Hope that’s what you wanted,

Mike

 
Sent from my iPad

> On 16 Apr 2019, at 22:13, 'Skip Cave' via Programming 
> <programm...@jsoftware.com> wrote:
> 
> I ran across this problem on Quora... How many ways can 100 be written as a
> sum of 7 ordered positive integers? (no repeats)
> The obvious brute force approach in J would be:
> 
> 
> odo=: #: i.@(*/) NB. Odometer verb
> 
> #b=.~./:~"1 a#~100=+/"1 a=.odo 7#100
> 
> |limit error: odo
> 
> | #b=:~./:~"1 a#~100=+/"1 a=: odo 7#100
> 
> Of course, odo 7#100 generates 1e14 integers (100^7) which exceeds memory.
> 
> So what would the most efficient way to solve this question in J? The most
> concise?
> 
> 
> Skip
> 
> Skip Cave
> Cave Consulting LLC
> ----------------------------------------------------------------------
> 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