모든 엔트리가 0 또는 1 인 30 x 30 Toeplitz 행렬을 고려하십시오 .
입력 없음
출력 A 30 x 30 Toeplitz 행렬의 모든 항목이 결정자와 함께 0 또는 1입니다.
점수 출력하는 행렬의 결정 요인입니다. 두 사람이 같은 점수를 얻으면 첫 번째 대답이 이깁니다.
지금까지 선두 항목
- Nick Alger의 Matlab 에서 65,455,857,159,975 (대략 (10 ^ 13.8)
- isaacg의 Python 에서 65,455,857,159,975 (대략 10 ^ 13.8)
- 2012rcampion까지 Mathematica 에서 39,994,961,721,988 (약 10 ^ 13.6)
- Flounderer의 R 에서 39,788,537,400,052 (대략 10 ^ 13.6)
- Vioz-의 Python 에서 8,363,855,075,832 (대략 10 ^ 12.9)
- Alex A.의 Julia의 6,984,314,690,903 (약 10 ^ 12.8)
성가신 추가 제약 2015 년 7 월 16 일
가능한 경우 임의의 또는 고정밀 산술을 사용하여 최종 출력 결정자를 계산하여 실제로 무엇인지 확인하십시오 (항상 정수 여야 함). 파이썬에서는 이것이 도움 이 될 것입니다.
답변
Matlab, 65,455,857,159,975 (10 ^ 13.8159)
이 방법은 큐브 [0,1] ^ 59 내부의 기울기 상승 이며 임의의 초기 추측이 많고 끝에서 반올림하여 모든 것을 0과 1로 만듭니다.
매트릭스:
0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0
0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1
1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1
1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1
1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0
0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1
1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1
1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1
1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0
0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1
1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0
0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0
0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1
1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0
0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0
0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1
1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0
0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1
1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1
1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0
0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1
1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0
0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0
0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0
0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0
0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1
1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1
1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1
1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0
암호:
% Toeplitz 0-1 determinant optimization
n = 30;
m = n + n-1;
toeplitz_map = @(w) toeplitz(w(n:-1:1), w(n:end));
objective = @(w) det(toeplitz_map(w));
detgrad = @(A) det(A)*inv(A)';
toeplitz_map_matrix = zeros(n^2,m);
for k=1:m
ek = zeros(m,1);
ek(k) = 1;
M = toeplitz_map(ek);
toeplitz_map_matrix(:,k) = M(:);
end
gradient = @(w) (reshape(detgrad(toeplitz_map(w)),1,n^2)*...
toeplitz_map_matrix)';
%check gradient with finite differences
w = randn(m,1);
dw = randn(m,1);
s = 1e-6;
g_diff = (objective(w+s*dw) - objective(w))/s;
g = gradient(w)'*dw;
grad_err = (g - g_diff)/g_diff
warning('off')
disp('multiple gradient ascent:')
w_best = zeros(m,1);
f_best = 0;
for trial=1:100000
w0 = rand(m,1);
w = w0;
alpha0 = 1e-5; %step size
for k=1:20
f = objective(w);
g = gradient(w);
alpha = alpha0;
for hh=1:100
w2 = w + alpha*g;
f2 = objective(w2);
if f2 > f
w = w2;
break;
else
alpha = alpha/2;
end
end
buffer = 1e-4;
for jj=1:m
if (w(jj) > 1)
w(jj) = 1 - buffer;
elseif (w(jj) < 0)
w(jj) = 0 + buffer;
end
end
end
w = round(w);
f = objective(w);
if f > f_best
w_best = w;
f_best = f;
end
disp(trial)
disp(f_best)
disp(f)
end
M = toeplitz_map(w_best);
그라디언트 계산 배후의 수학 :
요소 별 내부 곱 (즉, Hilbert-Schmidt 내부 곱) 에서 결정자 의 기울기는 다음과 같이 Riesz 대표 G를 갖습니다.
G = det (A) A ^ (-*).
최적화 변수 (대각선 값)에서 toeplitz 행렬까지의 맵 J는 선형이므로 전체 그래디언트 g는이 두 선형 맵의 구성입니다.
g = (vec (G) * J) ‘,
여기서 vec ()는 행렬을 가져와 벡터로 펼치는 벡터화 연산자 입니다.
내부 그라디언트 상승 :
이 작업을 마친 후에는 대각선 값 w_0의 초기 벡터를 선택하고 일부 작은 단계 크기의 경우 알파를 반복합니다.
-
w_proposed = w_k + 알파 * g_k
-
w_ (k + 1)을 얻으려면 w_proposed를 취하고 [0,1] 외부의 값을 0 또는 1로 자릅니다.
-
만족할 때까지 반복 한 다음 모든 것을 0 또는 1로 반올림하십시오.
내 결과는 균일 한 무작위 초기 추측으로 약 80,000 회 시도를 한 후이 결정 요인을 달성했습니다.
답변
Numpy가 포함 된 Python 2, 65,455,857,159,975 ~ = 10 ^ 13.8
이것은 가능한 한 간단하게 언덕을 오르는 것입니다. 정확한 결과를 얻기 위해 SymPy를 사용하여 최종 결정자 계산을 수행했습니다. 이 결정 요인으로 찾은 모든 행렬은 순환입니다.
이 결정과 함께 발견 된 행렬은 왼쪽 아래에서 오른쪽 위의 대각선 값으로 제공됩니다.
01000100101101000011100111011101000100101101000011100111011
01011101110011100001011010010001011101110011100001011010010
01100001000111011101001110100101100001000111011101001110100
01110100111010010110000100011101110100111010010110000100011
01011101110001000011010010111001011101110001000011010010111
01000101100010110100111101110001000101100010110100111101110
01000100101101000011100111011101000100101101000011100111011
첫 번째는 매트릭스입니다.
[[1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1]
[1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1]
[1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0]
[0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1]
[1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1]
[1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1]
[1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0]
[0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0]
[0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1]
[1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1]
[1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1]
[1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0]
[0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0]
[0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0]
[0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0]
[0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1]
[1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0]
[0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1]
[1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1]
[1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0]
[0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1]
[1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0]
[0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0]
[0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1]
[1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0]
[0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0]
[0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0]
[0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1]
[1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0]
[0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1]]
암호:
import numpy as np
import sympy as sp
import random
import time
SIZE = 30
random.seed(0)
def gen_diag():
return [random.randint(0, 1) for i in range(SIZE*2 - 1)]
def diag_to_mat(diag):
return [diag[a:a+SIZE] for a in range(SIZE-1, -1, -1)]
def diag_to_det(diag):
matrix = diag_to_mat(diag)
return np.linalg.det(matrix)
def improve(diag):
old_diag = diag
really_old_diag = []
while really_old_diag != old_diag:
really_old_diag = old_diag
for flip_at in range(SIZE * 2 - 1):
new_diag = old_diag[:]
new_diag[flip_at] ^= 1
old_diag = max(old_diag, new_diag, key=diag_to_det)
return old_diag
overall_best_score = 0
time.clock()
while time.clock() < 500:
best = improve(gen_diag())
best_score = diag_to_det(best)
if best_score > overall_best_score:
overall_best_score = best_score
overall_best = best
print(time.clock(), sp.Matrix(diag_to_mat(overall_best)).det(), ''.join(map(str,overall_best)))
mat = diag_to_mat(overall_best)
sym_mat = sp.Matrix(mat)
print(overall_best)
print(sym_mat.det())
답변
R, 397885337 400 052
유전자 알고리즘을 시도했지만 무성 생식으로 만 시도했습니다. 도전을 올바르게 이해했으면합니다. 편집 : 약간의 속도를 내고 다른 무작위 시드를 시도했으며 100 세대로 제한했습니다.
options(scipen=999)
toeplitz <- function(x){
# make toeplitz matrix with first row
# x[1:a] and first col x[(a+1):n]
# where n is the length of x and a= n/2
# Requires x to have even length
#
# [1,1] entry is x[a+1]
N <- length(x)/2
out <- matrix(0, N, N)
out[1,] <- x[1:N]
out[,1] <- x[(N+1):length(x)]
for (i in 2:N){
for (j in 2:N){
out[i,j] <- out[i-1, j-1]
}
}
out
}
set.seed(1002)
generations <- 100
popsize <- 25
cols <- 60
population <- matrix(sample(0:1, cols*popsize, replace=T), nc=cols)
numfresh <- 5 # number of totally random choices added to population
for (i in 1:generations){
fitness <- apply(population, 1, function(x) det(toeplitz(x)) )
mother <- which(fitness==max(fitness))[1]
population <- matrix(rep(population[mother,], popsize), nc=cols, byrow=T)
for (i in 2:(popsize-numfresh)){
x <- sample(cols, 1)
population[i,x] <- 1-population[i,x]
}
for (i in (popsize-numfresh +1):popsize){
population[i,] <- sample(0:1, cols, replace=T)
}
print(population[1,])
print(fitness[mother])
print(det(toeplitz(population[1,]))) # to check correct
}
산출:
print(population[1, 1:(cols/2)]) # first row
print(population[1, (cols/2+1):(cols)]) # first column (overwrites 1st row)
to <- toeplitz(population[1,])
for (i in 1:(cols/2)) cat(to[i,], "\n")
1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0
0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1
1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0
0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0
0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0
0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1
1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1
1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1
1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1
1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0
0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1
1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1
1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1
1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0
0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0
0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0
0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0
0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1
1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0
0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0
0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1
1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0
0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0
0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0
0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0
0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1
1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0
0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1
1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1
1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1
답변
줄리아, 6,984,314,690,902.998
이것은 1,000,000 개의 랜덤 Toeplitz 행렬을 구성하고 결정 요인을 확인하여 최대 발생을 기록합니다. 바라건대 누군가가 우아한 분석 솔루션을 제시 할 것이지만 그 동안 …
function toeplitz(a, b)
n = length(a)
T = Array(Int, n, n)
T[1,:] = b
T[:,1] = a
for i = 2:n
T[i,2:n] = T[i-1,1:n-1]
end
T
end
d = 0
A = Any[]
for i = 1:1000000
# Construct two random 0,1 arrays
r1 = rand(0:1, 30)
r2 = rand(0:1, 30)
# Compute the determinant of a toeplitz matrix constructed
# from the two random arrays
D = det(toeplitz(r1, r2))
# If the computed determinant is larger than anything we've
# encountered so far, add it to A so we can access it later
D > d && begin
push!(A, (D, r1, r2))
d = D
end
end
M,N = findmax([i[1] for i in A])
println("Maximum determinant: ", M, "\n")
println(toeplitz(A[N][2], A[N][3]))
여기서 출력을 볼 수 있습니다 .
답변
Mathematica, 39,994,961,721,988 (10 ^ 13.60)
간단한 시뮬레이션 어닐링 최적화 방법; 아직 최적화 나 조정이 없습니다.
n = 30;
current = -\[Infinity];
best = -\[Infinity];
saved = ConstantArray[0, {2 n - 1}];
m := Array[a[[n + #1 - #2]] &, {n, n}];
improved = True;
iters = 1000;
pmax = 0.1;
AbsoluteTiming[
While[improved || RandomReal[] < pmax,
improved = False;
a = saved;
Do[
Do[
a[[i]] = 1 - a[[i]];
With[{d = Det[m]},
If[d > best,
best = d;
current = d;
saved = a;
improved = True;
Break[];,
If[d > current || RandomReal[] < pmax (1 - p/iters),
current = d;
Break[];,
a[[i]] = 1 - a[[i]];
]
];
;
],
{i, 2 n - 1}];,
{p, iters}];
];
]
best
Log10[best // N]
a = saved;
m // MatrixForm
샘플 출력 :
{20.714876,Null}
39994961721988
13.602
(1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0
0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0
0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0
0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0
0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1
1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0
0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0
0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0
0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0
0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1
1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0
0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1
1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1
1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0
0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1
1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1
1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1
1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0
0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1
1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1
1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0
0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0
0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0
0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0
0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1
1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0
0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1
1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1
1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1
)
답변
파이썬 2, 8 363 855 075 832
이것은 매우 기본적이고 거의 존재하지 않는 전략을 가지고 있습니다.
from scipy import linalg
start = 2**28
mdet = 0
mmat = []
count = 0
powr = 1
while 1:
count += 1
v = map(int,bin(start)[2:].zfill(59))
m = [v[29:]]
for i in xrange(1,30):
m += [v[29-i:59-i]]
d = 0
try: d = linalg.det(m, check_finite=False)
except: print start
if d > mdet:
print d
print m
mdet = d
mmat = m
start += 1
powr = 1
else:
start += 2**powr
powr += 1
if start>(2**59-1):
start-=2**59-1
powr = 1
if count%10000==0: print 'Tried',count
~ 5,580,000 회 시도 후에 찾은 최고의 행렬은 다음과 같습니다.
1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0
1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1
1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0
0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1
1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1
0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0
1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1
0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0
0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0
1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1
1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0
0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0
0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0
0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0
0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0
0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0
1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1
0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1
1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1
1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0
1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1
1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1
1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1
1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0
1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1
1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1
0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0
0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0
1 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1
0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1
아직 실행 중 …