(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