Partition the matrix by the smallest element, then work separately on each partition.
On Tue, May 19, 2020 at 8:11 PM Skip Cave <s...@caveconsulting.com> wrote: > Testing Roger's rotational duplicate finder: > > ts=:6!:2 , 7!:2@] > > $x=.odo 8#8 > > 16777216 8 > > ts 't0=.llr0 x' > > 37.0263 2.14749e9 > > ts 't1=.llr1 x' > > 26.6041 2.14749e9 > > ts 't3=.llr3 x' > > 34.1857 1.28849e10 > > ts 't2=.llr2 x' > > |out of memory: llr2 > > | (c*i.n){}."1/:~(c#i.n),.((n*c)$i.c) |."_1 c#y > > ts=:6!:2 , 7!:2@] > > > It looks like fairly lengthy runtimes for 8 integers. For more than 8-10 > elements we may need a more efficient algorithm. > > > Skip Cave > Cave Consulting LLC > > > On Tue, May 19, 2020 at 9:14 PM Roger Hui <rogerhui.can...@gmail.com> > wrote: > > > I think in such cases you ought to do i.!.0~x first (as the write-up > points > > out). Then you'd be working with small-range integers and the maximum > > element shouldn't cause a problem. Unless you are working with a huge x. > > In which case you have other problems. > > > > On Tue, May 19, 2020 at 6:32 PM Raul Miller <rauldmil...@gmail.com> > wrote: > > > > > Perhaps worth noting that the "radius limit" is calculable based on > > > the type of the numbers in the argument. > > > > > > For integer values, on a 64 bit machine, radius*#y should not exceed > > > 9223372036854775807 > > > > > > datatype 9223372036854775807 > > > integer > > > datatype 9223372036854775807+1 > > > floating > > > > > > It gets a little more complicated with floating point values, because > > > there the minimum difference between elements in a row is essential > > > for the calculation. If this is deemed to be worth to bother, it can > > > be calculated using 0 -.~ 2 -/\ \:~ row and finding the minimum > > > non-zero value. (If this is an empty list, all rows are already in > > > their canonical configuration.) If this value is available, > > > radius*mindiff*#y should not exceed 9007199254740991. (A convservative > > > approximation would be to verify that there are no fractional values > > > and use mindiff=.1) > > > > > > Not sure that this is worth the effort, but... anyways... > > > > > > FYI, > > > > > > -- > > > Raul > > > > > > On Tue, May 19, 2020 at 11:37 AM Roger Hui <rogerhui.can...@gmail.com> > > > wrote: > > > > > > > > I have written a lengthier description > > > > <https://forums.dyalog.com/viewtopic.php?f=30&t=1642> of the > solutions > > > in > > > > the Dyalog APL Chat Forum. It is in APL rather than J notation, but > > may > > > be > > > > helpful. The main thing to remember is that " (the rank operator) > is ⍤ > > > in > > > > Dyalog APL. > > > > > > > > > > > > > > > > On Sun, May 17, 2020 at 10:44 PM Skip Cave <s...@caveconsulting.com> > > > wrote: > > > > > > > > > Roger, > > > > > The llr versions you provided are interesting and useful. I expect > to > > > learn > > > > > much by analysing them. > > > > > > > > > > Skip Cave > > > > > > > > > > > > > > > > > > > > On Sun, May 17, 2020 at 3:09 PM Roger Hui < > rogerhui.can...@gmail.com > > > > > > > > wrote: > > > > > > > > > > > (I posted the following msg which appears not to be distributed. > > > Not yet > > > > > > in the archive, at least. Sorry if you receive this more than > > once.) > > > > > > > > > > > > llr0=: {.@(/:~)@(i.@# |."0 1 ])"1 > > > > > > > > > > > > llr1=: {.@(/:~)@(([: I. ] = <./)|."0 1 ])"1 > > > > > > > > > > > > llr2=: 3 : 0 > > > > > > c=. {: $ y > > > > > > n=. # y > > > > > > (c*i.n) { }."1 /:~ (c#i.n) ,. ((n*c)$i.c) |."_1 c # y > > > > > > ) > > > > > > > > > > > > llr3=: 3 : 0 > > > > > > c=. {: $ y NB. # columns > > > > > > n=. # y NB. # rows > > > > > > r=. >:+:>./|,y NB. the "radius" > > > > > > q=. y + r*i.n NB. increase each row by the radius > > > > > > e=. <./"1 q NB. minimum in each row > > > > > > b=. q=e NB. where elements equal the minimum > > > > > > s=. +/"1 b NB. # times that happens for each row > > > > > > (r*i.n) -~ (}:+/\0,s) { /:~ (c|I.,b) |."_1 s#q > > > > > > ) > > > > > > > > > > > > llr0 computes the lexicographically least rotation of all the > > > rotations > > > > > of > > > > > > each row. > > > > > > > > > > > > llr1 computes the LLR of, each row rotated so that every minimal > > > element > > > > > > gets the chance to be the first element. > > > > > > > > > > > > llr2 is llr0 reworked so that the code works on the entire matrix > > at > > > > > once, > > > > > > rather than one row at a time. > > > > > > > > > > > > llr3 likewise, llr2 reworked to work on the entire matrix at > once. > > > It > > > > > > assumes that the maximal element in the entire matrix (needed for > > the > > > > > > "radius") is no so large as to consume all available precision. > > > > > > > > > > > > odo=: #: i.@(*/) > > > > > > x=: ,.~ ,~ odo 5$5 > > > > > > $x > > > > > > 6250 10 > > > > > > > > > > > > (llr0 -: llr1) x > > > > > > 1 > > > > > > (llr0 -: llr2) x > > > > > > 1 > > > > > > (llr0 -: llr3) x > > > > > > 1 > > > > > > > > > > > > timer=: 6!:2 > > > > > > timer&> 'llr0 x'; 'llr1 x'; 'llr2 x'; 'llr3 x' > > > > > > 0.0434449 0.0141476 0.0207071 0.00634583 > > > > > > > > > > > > > > > > > > On Sat, May 16, 2020 at 4:44 PM Skip Cave < > s...@caveconsulting.com > > > > > > > > wrote: > > > > > > > > > > > > > I have run across this issue a few times in the past. > > > > > > > The following 8x4 array has several rows that are 'rotational > > > > > > duplicates'. > > > > > > > > > > > > > > ]n=.8 4$2 4 1 3 2 3 4 1 3 4 1 2 3 2 4 1 1 3 2 4 4 1 2 3 1 2 3 > 4 4 > > > 1 3 2 > > > > > > > > > > > > > > 2 4 1 3 > > > > > > > > > > > > > > 2 3 4 1 > > > > > > > > > > > > > > 3 4 1 2 > > > > > > > > > > > > > > 3 2 4 1 > > > > > > > > > > > > > > 1 3 2 4 > > > > > > > > > > > > > > 4 1 2 3 > > > > > > > > > > > > > > 1 2 3 4 > > > > > > > > > > > > > > 4 1 3 2 > > > > > > > > > > > > > > > > > > > > > Is it possible to develop a verb that would find the rows that > > are > > > > > > > rotational duplicates of each other. That is, find all the rows > > > that > > > > > > would > > > > > > > be the same, if each row was rotated some integer value in the > > > first > > > > > > > dimension. The output of the verb would be the same shape > array, > > > but > > > > > with > > > > > > > each duplicate row rotated such that they show as identical. > > > Picking > > > > > the > > > > > > > 'standard' rotation for a set of rotational duplicates is up to > > the > > > > > > > implementer. > > > > > > > > > > > > > > > > > > > > > Skip > > > > > > > > > > ---------------------------------------------------------------------- > > > > > > > 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 > > > ---------------------------------------------------------------------- > > > 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