42 lines
541 B
Plaintext
42 lines
541 B
Plaintext
program perm
|
|
local n=`1'
|
|
local r=1
|
|
forv i=1/`n' {
|
|
local r=`r'*`i'
|
|
}
|
|
clear
|
|
qui set obs `r'
|
|
forv i=1/`n' {
|
|
gen p`i'=0
|
|
}
|
|
mata: genperm()
|
|
end
|
|
|
|
mata
|
|
void genperm() {
|
|
real scalar n, i, j, k, s, p
|
|
real rowvector u
|
|
st_view(a=., ., .)
|
|
n = cols(a)
|
|
u = 1..n
|
|
p = 1
|
|
do {
|
|
a[p++, .] = u
|
|
for (i = n; i > 1; i--) {
|
|
if (u[i-1] < u[i]) break
|
|
}
|
|
if (i > 1) {
|
|
j = i
|
|
k = n
|
|
while (j < k) u[(j++, k--)] = u[(k, j)]
|
|
|
|
s = u[i-1]
|
|
for (j = i; u[j] < s; j++) {
|
|
}
|
|
u[i-1] = u[j]
|
|
u[j] = s
|
|
}
|
|
} while (i > 1)
|
|
}
|
|
end
|