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  }