Эрмитова матрица?

18

Обратите внимание, что эта задача не требует обработки или понимания комплексных чисел.

Учитывая непустую квадратную матрицу, где каждый элемент является двухэлементным (Re, Im) целочисленным списком, определите (давая любые значения истинности / ложности или любые два непротиворечивых значения), представляет ли это эрмитову матрицу.

Обратите внимание, что входные данные являются трехмерным массивом целых чисел; не двумерный массив комплексных чисел. Если ваш язык не может взять трехмерный массив напрямую, вы можете взять плоский список (и форму n × n или n × n × 2, если это поможет).

Матрица является эрмитовой, если она равна собственной сопряженной транспонировании . Другими словами, если вы перевернете его по диагонали от верхнего левого до нижнего правого и отрицаете второй элемент всех двухэлементных листовых списков, он будет идентичен входной матрице. Обратите внимание, что порядок переворота и отрицания не имеет значения, поэтому вы можете сначала отрицать, а потом перевернуть.

Пройти хотя бы пример

Этот пример использует JSON с лишним пробелом для облегчения чтения:

[[ [2, 0] , [2, 1] , [4, 0] ],
 [ [2,-1] , [3, 0] , [0, 1] ],
 [ [4, 0] , [0,-1] , [1, 0] ]]

Транспонировать (перевернуть NW — SE диагональ):

[[ [2, 0] , [2,-1] , [4, 0] ],
 [ [2, 1] , [3, 0] , [0,-1] ],
 [ [4, 0] , [0, 1] , [1, 0] ]]

Отрисуем вторые элементы лист-списков:

[[ [2, 0] , [2, 1] , [4, 0] ],
 [ [2,-1] , [3, 0] , [0, 1] ],
 [ [4, 0] , [0,-1] , [1, 0] ]]

Поскольку это идентично вводу, матрица является эрмитовой.

Контрольные примеры

эрмитова

[[[2,0],[2,1],[4,0]],[[2,-1],[3,0],[0,1]],[[4,0],[0,-1],[1,0]]]

[[[1,0],[2,0]],[[2,0],[1,0]]]

[[[1,0],[2,-3]],[[2,3],[1,0]]]

[[[42,0]]]

Неэрмитовых

[[[2,0],[2,1],[4,0]],[[2,-1],[3,0],[0,1]],[[4,0],[0,-1],[1,-1]]]

[[[0,1],[0,2]],[[0,2],[0,1]]]

[[[1,0],[2,3]],[[2,3],[1,0]]]

[[[3,2]]]

Адам
источник
@ LuisMendo Я все еще думаю. Есть идеи?
Адам
Для записи, новый Мета-пост . (Я не голосовал, чтобы закрыть, но я вижу, что кто-то имеет, поэтому мне интересно, что сообщество думает по этому поводу).
Стьюи Гриффин
5
@ Adám Я бы сделал это как можно более явным, но это зависит от вас. Гибкость в форматах ввода и вывода обычно желательна, но не может быть выведена по умолчанию, особенно если вы говорите, что вход представляет собой трехмерный массив действительных чисел; не двумерный массив комплексных чисел . Непонятно, насколько широка ваша концепция формата ввода трехмерного массива
Луис Мендо,
3
@ Adám Можно ли взять в качестве входных данных пару двумерных матриц (одну для вещественной части, другую для мнимой части)?
Дилнан
1
@dylnan Нет. Входные данные должны быть единой структурой, представляющей некоторую трехмерность, где размерность листа содержит пары Re-Im.
Адам

Ответы:

10

R 71 48 47 байт

function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)

Принимает трехмерный массив действительных чисел, создает двумерный массив воображаемых чисел, транспонирует, сопрягает и сравнивает.

Спасибо @Giuseppe за уменьшение количества байтов на 23 изумительных байта и @Vlo за финальный 1!

Попробуйте онлайн!

Пример:

> A <- array(c(2,2,4,2,3,0,4,0,1,0,-1,0,1,0,-1,0,1,0),dim=c(3,3,2))
> A
, , 1

     [,1] [,2] [,3]
[1,]    2    2    4
[2,]    2    3    0
[3,]    4    0    1

, , 2

     [,1] [,2] [,3]
[1,]    0    1    0
[2,]   -1    0    1
[3,]    0   -1    0

> f <- function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)
> f(A)
[1] TRUE
plannapus
источник
1
B=A[,,1]+A[,,2]*1iследует сохранить несколько байтов.
Джузеппе
@ GIuseppe arf Я думал, что попробовал это, но, видимо, нет. Благодарность!
plannapus
1
Кроме того, isSymmetricсуществует и работает для эрмитовых комплексных матриц, но 1x1дело сложное, так как [отбрасывает атрибуты, и это приводит к complexскорееmatrix
Giuseppe
2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)In-line назначение сохраняет 1.
Vlo
7

Октава , 39 34 31 байт

@(x)(y=x(:,:,1)+j*x(:,:,2))==y'

Попробуйте онлайн!

Сохранено 3 байта благодаря Луису Мендо, который сообщил мне о разъяснениях в тексте задания.

Объяснение:

В MATLAB и Octave, 'это сопряженный комплекс транспонирования, а не «регулярный» транспонирования.

Мы создаем переменную yinline, это первый слой трехмерной матрицы плюс второй слой, умноженный на сложную единицу j, то есть сложную матрицу, где реальный термин - это первый «слой», а воображаемый - второй «слой». Затем мы проверяем, равно ли оно комплексно сопряженному транспонированному.

Это выведет матрицу, содержащую только, 1если true, и матрицу, содержащую, по крайней мере, одну, 0если false. Они считаются истинными и ложными в Октаве (Доказательство) .

Стьюи Гриффин
источник
5

APL (Dyalog Unicode) , 22 15 9 7 байт

⍉≡⊢∘-

Попробуйте онлайн!

Функция молчаливого префикса.

Спасибо Адаму за 7 байт в Dfn, а также Адаму и ErikTheOutgolfer за то, что они смирились с моей глупостью, помогая мне найти молчаливую версию.

Благодаря ngn за 2 байта на молчаливой версии.

Как?

⍉≡⊢∘- Anonymous tacit function.
      ¨  Apply to each element of the argument:
     \   Cumulative reduction, using
  ⊢∘-    Ignore the first element, then negate the second
        And match
        To the argument's transposition.
Ж. Салле
источник
5

Wolfram Language (Mathematica) , 45 34 33 26 21 18 байт

  • Сохранено одиннадцать байтов благодаря JungHwan Мин .
  • Спас Байт благодаря Мартину Эндеру .
  • Сохранено семь байтов благодаря Alephalpha .
  • Сохранено пять байтов благодаря Alephalpha .
  • Сохранено три байта.
#==#&[#.{1,I}]&

Попробуйте онлайн!

Джонатан Фрех
источник
34 байта: попробуйте онлайн!
JungHwan Мин
@alephalpha Большое спасибо; Я знаю, что 0xf3c7это оператор транспонирования, но что это 0xf3c8?
Джонатан Фрех
1
@alephalpha Существует также 0xf3c9( Документация Wolfram ).
Джонатан Фрех
4

Java 8, 137 136 134 126 119 116 байт

m->{int r=1,l=m.length,i=l*l,j,k;for(;i-->0;)r=m[j=i/l][k=i%l][0]!=m[k][j][0]|m[j][k][1]!=-m[k][j][1]?0:r;return r;}

-3 байта благодаря @ceilingcat .

Возвращает, 1если эрмитово, в 0противном случае.

Объяснение:

Попробуйте онлайн.

m->{                 // Method with 3D integer-array as parameter and boolean return-type
  int r=1,           //  Flag-integer `r`, starting at 1
      l=m.length,    //  The size of the 3D input array
      i=l*l,j,k;     //  Index-integers
  for(;i-->0;)       //  Loop over the rows and columns
    r=m[j=i/l][k=i%l][0]!=m[k][j][0]
                     //   If the first numbers diagonally aren't equal,
      |m[j][k][1]!=-m[k][j][1]?
                     //   or the second numbers aren't negatives of each other:
       0             //    Set the flag `r` to 0
      :              //   Else:
       r;            //    Leave the flag `r` the same
  return r;}         //  Return the flag `r`
Кевин Круйссен
источник
3

J , 14 байт

[:(+-:|:)j./"1

Попробуйте онлайн!

объяснение

[:(+-:|:)j./"1  Input: 3d array
         j./"1  Reduce by complex combine at rank 1
[:              Cap, operate on the 2d array of complex values
   +              Conjugate
      |:          Transpose
    -:            Match?
миль
источник
Также 14:-:0 2|:(,-)/"1
FrownyFrog
3

Желе ,  6  5 байт

Z×Ø+⁼

Возвращение монадической ссылки 1 для эрмитова ввода и в 0противном случае.

Попробуйте онлайн!

Как?

Z×Ø+⁼ - Link: list of lists of lists, M
Z     - transpose
  Ø+  - literal = [1,-1]
 ×    - multiply (vectorises)
    ⁼ - equal to M?
Джонатан Аллан
источник
Я верю, что современное желе имеет Ø+.
lirtosiast
@lirtosiast действительно вы правы, обновлены, чтобы использовать его; Благодарность!
Джонатан Аллан
1

Perl 5 , -a0 48 байт

Старый счет: 50 байт ( +2для a0). Неплохо для языка, в котором нет встроенной транспонирования (я вообще не ревную, нет, сэрри)

Дайте входную матрицу на STDIN с , между действительной и мнимой частями, например:

2,0 2,1 4,0
2,-1 3,0 0,1
4,0 0,-1 1,0

Напечатаю 1для эрмита, иначе ничего

#!/usr/bin/perl -a0
say@F~~[map/(\S+,)(\S+)/gc?$1.-$2:(),(/.+/g)x@F]

Попробуйте онлайн!

Тон Хоспел
источник
1

Шелуха , 7 байт

=¹mmṀ_T

Попробуйте онлайн!

Как?

Обратите внимание, что должно работать вместо mm , но есть раздражающая ошибка которая мешает мне использовать его :(

= ¹mmṀ_T - Полная программа. Принимает входные данные из аргументов командной строки, как список списков кортежей.
  m T - для каждого списка в транспонированном входе ...
   mṀ_ - ... Отрицание последнего значения каждого кортежа, который они содержат.
= ¹ - Проверьте, совпадает ли это с вводом.
Мистер Xcoder
источник
1

C (gcc) , 107 103 100 байт

j,k,r;f(A,s)int***A;{for(r=0,j=s;j--;)for(k=s;k--;)r|=*A[j][k]-*A[k][j]|A[j][k][1]+A[k][j][1];A=!r;}

Попробуйте онлайн!

Джонатан Фрех
источник
103 байта
Steadybox
@Steadybox Большое спасибо. Забавно ... Несколько часов назад я имел в виду именно этот гольф - разыменование вместо индексации - но просто забыл ...
Джонатан Фрех
@ceilingcat Спасибо.
Джонатан Фрех
0

На самом деле , 13 байтов

┬⌠⌠Çá╫k⌡M⌡Mß=

Попробуйте онлайн!

Как это устроено?

Это представление на самом деле использует комплексные числа. Если было разрешено принимать входные данные в качестве матрицы сложных записей, то это было бы 8 байтов .

┬⌠⌠Çá╫k⌡M⌡Mß=  –> Full program.
┬              –> Transpose.
 ⌠       ⌡M    –> For each list in the input's transpose do the following:
  ⌠    ⌡M         –> For each two-element list of the form [a, b]...
   Ç              –> Turn it into a complex number (a+bi).
    á             –> Find its complex conjugate: Push (a-bi).
     ╫k           –> Push [Re(N), Im(N)], so [a, -b].
           ß=  –> Check whether the result equals the input.
Мистер Xcoder
источник
0

Pyth, 9 байт

qCmm,hk_e

Объяснение:

qCmm,hk_ekdQQ  Autofill variables
    ,hk_ek     [a,-b]...
  mm      dQ    ...for each [a,b] in the input (m...Q)'s rows (m...d).
 C             Transpose.
q           Q  Is this result equal to the original?

Тестовый пакет .

Стивен Х.
источник
Ваш ответ на самом деле 9 байт ... 9-байтовый альтернатива: qCmm*V_B1.
г-н Xcoder
Я отправил один байт, когда делал представление, из qCmm.e_Fbk... по-видимому, я забыл отредактировать счетчик байтов в окончательном представлении. @ Mr.Xcoder Я все исправил, спасибо за улов!
Стивен Х.
0

C  111   110  108 байт

Спасибо @Jonathan Frech за сохранение байта и спасибо @ceilingcat за сохранение двух байтов!

i,j,r;f(A,n)int*A;{for(r=i=0;i<n*2;i+=2)for(j=n*2;j;r|=A[i*n+j]-A[j*n+i]|A[i*n-~j]+A[j*n-~i])j-=2;return!r;}

Попробуйте онлайн!

C (gcc) ,  106  104 байта

i,j,r;f(A,n)int*A;{for(r=i=0;i<n*2;i+=2)for(j=n*2;j;r|=A[i*n+j]-A[j*n+i]|A[i*n-~j]+A[j*n-~i])j-=2;A=!r;}

Попробуйте онлайн!

Steadybox
источник
Я думаю, что r|=...|...работает так же, как и r+=...||....
Джонатан Фрех
@JonathanFrech Да, это так. Благодарность!
Steadybox
0

На самом деле , 13 байтов

;┬⌠⌠d±@q⌡M⌡M=

Попробуйте онлайн!

Объяснение:

;┬⌠⌠d±@q⌡M⌡M=
;              make a copy
 ┬             transpose copy
  ⌠⌠d±@q⌡M⌡M   for each row:
   ⌠d±@q⌡M       for each cell in row:
    d              remove last element from list
     ±             swap sign
      @q           insert at end of list
            =  compare equality with original
Mego
источник