Оптимізаційна версія проблеми Адамара


11

По-перше, деякі визначення.

Матриця Адамара є квадратну матрицю, елементами якої є +1 або -1 , а рядки якої взаємно ортогональні. Гіпотеза Адамара передбачає , що матриця Адамара порядку 4к існує для будь-якого натурального числа к.

Циркулянт є особливим видом матриці , де кожен вектор - рядок обертають один елемент вправо щодо попереднього вектора - рядки. Тобто матриця визначається її першим рядком.

Як відомо , що для 4 по 4 матриць , за винятком, немає жодного циркулянтних матриць Адамар .

Матриця з m рядками та n> = m стовпцями є частковою циркуляційною силою , якщо це перші m рядків деякої матриці циркуляційної рідини.

Завдання

На кожне парне ціле число n, починаючи з 2, виведіть розмір найбільшої матриці часткової циркуляції з + -1 записами та n стовпцями, що має властивість, що всі її ряди є взаємно ортогональними.

Оцінка

Ваш бал є найвищим nтаким, що для всіх k <= nніхто більше не опублікував правильну відповідь, ніж ви. Зрозуміло, що якщо у вас є всі оптимальні відповіді, ви отримаєте бал за найвищу nпосаду. Однак, навіть якщо ваша відповідь не є оптимальною, ви все одно можете отримати бал, якщо ніхто більше не може його перемогти.

Мови та бібліотеки

Ви можете використовувати будь-яку доступну мову та бібліотеки, які вам подобаються. Там, де це можливо, було б добре запустити свій код, тому, будь-ласка, включіть повне пояснення, як запустити / скомпілювати свій код в Linux, якщо це можливо.

Провідні записи

  • 64 Мітч Шварц у Пітоні

Відповіді:


7

Пітон 2

Таблиця до n = 64, перевірена оптимально з грубою силою до n = 32:

 4  4 0001
 8  4 00010001
12  6 000001010011
16  8 0000010011101011
20 10 00010001011110011010
24 12 000101001000111110110111
28 14 0001011000010011101011111011
32 14 00001101000111011101101011110010
36 18 001000101001000111110011010110111000
40 20 0010101110001101101111110100011100100100
44 18 00010000011100100011110110110101011101101111
48 24 001011011001010111111001110000100110101000000110
52 26 0011010111000100111011011111001010001110100001001000
56 28 00100111111101010110001100001101100000001010100111001011
60 30 000001101101100011100101011101111110010010111100011010100010
64 32 0001100011110101111111010010011011100111000010101000001011011001

де 0представляє -1. Якщо nне ділиться на 4, то m = 1це оптимально. Створено за допомогою цього коду (або невеликих його варіантів), але з більшою кількістю випробувань для вищих n:

from random import *

seed(10)

trials=10000

def calcm(x,n):
    m=1
    y=x
    while 1:
        y=((y&1)<<(n-1))|(y>>1)
        if bin(x^y).count('1')!=n/2:
            return m
        m+=1

def hillclimb(x,n,ns):
    bestm=calcm(x,n)

    while 1:
        cands=[]

        for pos in ns:
            xx=x^(1<<pos)
            m=calcm(xx,n)

            if m>bestm:
                bestm=m
                cands=[xx]
            elif cands and m==bestm:
                cands+=[xx]

        if not cands:
            break

        x=choice(cands)

    return x,bestm

def approx(n):
    if n<10: return brute(n)

    bestm=1
    bestx=0

    for trial in xrange(1,trials+1):
        if not trial&16383:
            print bestm,bin((1<<n)|bestx)[3:]

        if not trial&1:
            x=randint(0,(1<<(n/2-2))-1)
            x=(x<<(n/2)) | (((1<<(n/2))-1)^x)
            ns=range(n/2-2)

            if not trial&7:
                adj=randint(1,5)
                x^=((1<<adj)-1)<<randint(0,n/2-adj)
        else:
            x=randint(0,(1<<(n-2))-1)
            ns=range(n-2)

        x,m=hillclimb(x,n,ns)

        if m>bestm:
            bestm=m
            bestx=x

    return bestm,bestx

def brute(n):
    bestm=1
    bestx=0

    for x in xrange(1<<(n-2)):
        m=calcm(x,n)
        if m>bestm:
            bestm=m
            bestx=x

    return bestm,bestx

for n in xrange(4,101,4):
    m,x=approx(n)
    print n,m,bin((1<<n)|x)[3:]

Підхід - це простий рандомізований пошук з підніманням на пагорби, скориставшись малюнком, поміченим для малих n. Зазвичай, для оптимальної mроботи друга половина першого ряду часто має невелику відстань редагування від (бітового) заперечення першої половини. Результати наведеного вище коду хороші для малих, nале починають погіршуватися недовго після того, як груба сила стає нездійсненною; Я був би радий бачити кращий підхід.

Деякі зауваження:

  • Коли nнепарне, m = 1є оптимальним, оскільки непарна кількість одиниць та негативних не може дорівнювати нулю. (Ортогональне означає крапковий добуток дорівнює нулю.)
  • Коли n = 4k + 2, m = 1це оптимально, тому що для того, щоб m >= 2ми мали між собою саме точні n/2звороти знаків {(a1,a2), (a2,a3), ... (a{n-1},an), (an,a1)}, і це означало б непарне число зворотних знаків a1 = -a1.
  • Точковий добуток у два ряди iі jв матриці циркуляції визначається за допомогою abs(i-j). Наприклад, якщо row1 . row2 = 0тоді row4 . row5 = 0. Це тому, що пари елементів для крапкового добутку однакові, просто повернені.
  • Отже, для перевірки взаємної ортогональності нам потрібно лише перевірити послідовні рядки проти першого ряду.
  • Якщо ми представляємо рядок як двійковий рядок з 0замість -1, ми можемо перевірити ортогональність двох рядків, взявши побітовий xor і порівнявши попконт з n/2.
  • Ми можемо зафіксувати перші два елементи першого ряду довільно, тому що (1) Нерегулювання матриці не впливає на те, чи дорівнює доткові точки дорівнює нулю, і (2) Ми знаємо, що повинно бути принаймні два суміжні елементи з однаковим знаком і два сусідні елементи з різним знаком, тому ми можемо обертатись, щоб розмістити потрібну пару на початку.
  • Рішення (n0, m0)автоматично дасть рішення (k * n0, m0)для довільного k > 1, шляхом (багаторазового) об'єднання першого ряду з собою. Наслідком цього є те, що ми можемо легко отримати m = 4для будь-якого nділеного на 4.

Природно, що гіпотеза n/2є тісною верхньою межею, mколи n > 4, але я не знаю, як це було б доведено.


Дуже цікаво, що немає рішення з 16 рядками та 32 стовпцями. У вас є ідеї, чому?

@ Лембік Якби у мене була ідея, я б написав її у відповіді.
Мітч Шварц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.