He intentado el siguiente enfoque
- generan una matriz unimodular $A$ (posiblemente con entradas grandes)
- arreglarlo para reducir el tamaño abs de las entradas
En 1, genero $n\times n$ matrices $L$ y $U$ con 1 en la diagonal; multiplícalos y permuta al azar filas y columnas.
En 2, repita hasta la "convergencia" el paso siguiente. Elija el elemento más grande en valor absoluto, suponga que es $a_{ij}$ . Elige una entrada aleatoria distinta de cero $a_{kj}$ en el $j$ -th columna, $k\ne i$ para reducir el tamaño de $a_{ij}$ con $a'_{i,.} = a_{i,.} + a_{k,.}$ .
genunimod <- function(n,k=5){
r <- trunc(sqrt(k))+1
A <- matrix(sample(-r:r,n**2,rep=T),n,n)
L <- matrix(0,n,n)
U <- matrix(0,n,n)
l <- outer(1:n,1:n,">")
u <- outer(1:n,1:n,"<")
L[l] <- A[l]
U[u] <- A[u]
diag(U) <- 1
diag(L) <- 1
p1 <- sample(1:n) #permutation shuffle rows
p2 <- sample(1:n) #permutation shuffle cols
P <- diag(rep(1,n)) # identity
A <- P[p1,] %*% L %*% U %*% P[p2,]
# this A is unimodular but may have large entries
m <- k+1
useless <- 0
steps <- 0
while(m>k & useless<=n**2){
steps <- steps+1
mm <- max(abs(A))
v <- which(abs(A)==mm,arr.ind=T)[1,]
# use a random element to reduce element v by row
k <- sample(which(A[,v[2]]!=0)[-v[1]],1)
s <- sign(A[v[1],v[2]]*A[k,v[2]])
A[v[1],] <- A[v[1],]-s*A[k,]
m <- max(abs(A)) # new max term
if(m>=mm) useless <- useless+1
}
list(A=A,LU=P[p1,] %*% L %*% U %*% P[p2,],steps=steps,useless=useless)
}
El código puede fallar de varias maneras: el elemento más grande puede, en principio, estar situado en una columna por lo demás nula; un solo paso puede no tener éxito en la reducción de la entrada más grande y detengo los cálculos si más de $n^2$ tal inútil se producen pasos.
La eficacia puede mejorarse enormemente utilizando métodos menos primitivos (por ejemplo, utilizando ideas "pivotantes" en lugar de elegir al azar $k$ utilizando columnas y filas, etc.).
Se tarda 1,2 segundos (en un Macbook Air) en generar 1000 $5\times5$ matrices unimodulares con entradas $\leq 10$ . Nunca tuve una columna "por lo demás cero" (¡bien!) y experimenté 69 "fallos" (7\%, ¡menos bien!) debidos a demasiados pasos inútiles. Por lo tanto, se necesitaron 1,2 segundos para crear 931 matrices. Los dígitos tienen la siguiente distribución en forma de campana. Debería ser simétrica y se da más peso a los números pequeños.
0 votos
No sé cómo, pero recuerdo que mi antiguo profesor de álgebra lineal decía que era una de las cosas más prácticas que conocía.
0 votos
Maldita sea, debería haber bountied esta pregunta a primera vista; que estaba languideciendo durante bastante tiempo ...
0 votos
Esto debería ser una respuesta, pero implica la reducción de celosía, que es un tema muy rico y quería comentarlo por si no llego a hacer el trabajo necesario para una buena explicación. Generar una matriz aleatoria (es decir, un determinante aleatorio). Elige una fila para cambiarla. La columna correspondiente en la inversa da los valores con los que reducir usando técnicas de reducción de retículo. Esto le dará los valores pequeños para la nueva fila.
0 votos
Utilizar la forma normal de Hermite también funciona, sólo que no da los valores más reducidos (aunque ni de lejos tan grandes como la respuesta de Kirill; creo que quizá sea porque utilizo el triángulo superior y no el inferior, o bien porque en su aplicación no redujo completamente a la forma única...).
0 votos
Adam W: ¿podría dar alguna referencia sobre esa cosa de la red mágica? graciasx
0 votos
@usuario, supongo que adam se refiere al algoritmo LLL...
0 votos
No conocía el algoritmo LLL, es una pieza matemática realmente asombrosa. @J.M. En forma abreviada LLL... ¡gracias! Está claro que puedes reducir cualquier matriz unimodular a una longitud cercana a la mínima y, por tanto, los coeficientes serán bajos. Supongo, sin embargo, que casi minimizar la longitud de vectores enteros es (mucho) más que encontrar entradas $\leq k$ .
0 votos
La reducción del tamaño mediante una fila o columna aleatoria es "primitiva" e ineficiente respecto al LLL, pero es probable que produzca matrices con entradas acotadas (hay que admitir que se aleja de la casi optimalidad del resultado del LLL. perdón por el largo bi-comentario ;-)