github.com/pavlo67/common@v0.5.3/common/mathlib/sets/signatures.go (about) 1 package sets 2 3 func SignatureCyclicInt(values []int) []int { 4 if len(values) < 1 { 5 return nil 6 } 7 8 maxII := []int{0} 9 for i := 1; i < len(values); i++ { 10 if values[i] > values[maxII[0]] { 11 maxII = []int{i} 12 } else if values[i] == values[maxII[0]] { 13 maxII = append(maxII, i) 14 } 15 } 16 17 maxI := maxII[0] 18 19 M: 20 for m := 1; m < len(maxII); m++ { 21 mI := maxII[m] 22 23 for i := 1; i < len(values); i++ { 24 if values[(maxI+i)%len(values)] > values[(mI+i)%len(values)] { 25 continue M 26 } else if values[(maxI+i)%len(values)] < values[(mI+i)%len(values)] { 27 maxI = mI 28 break 29 } 30 } 31 } 32 33 signature := make([]int, len(values)) 34 35 for i := range values { 36 signature[i] = values[(maxI+i)%len(values)] 37 } 38 39 return signature 40 }