Как я могу использовать R для генерации ортогонального латинского квадрата с учетом этого свойства? - PullRequest
0 голосов
/ 02 мая 2020

Я сделаю все возможное, чтобы объяснить математику - если вам нужны дальнейшие разъяснения, пожалуйста, дайте мне знать.

Пусть q - простое число, тета - генератор группы цикли c, а i = 1, ..., q-1.

Я хочу создать квадрат используя этот общий шаблон:

(0)                (1)                 (2)                 (x)                (1+x)              ...  (a_(q-1))
(0)+theta^(0+i)    (1)+theta^(0+i)     (2)+theta^(0+i)     (x)+theta^(0+i)    (1+x)theta^(0+i)   ... (a_(q-1))+theta^(0+i)  
(0)+theta^(1+i)    (1)+theta^(1+i)     (2)+theta^(1+i)     (x)+theta^(1+i)    (1+x)theta^(1+i)   ... (a_(q-1))+theta^(1+i)
(0)+theta^(2+i)    (1)+theta^(2+i)     (2)+theta^(2+i)     (x)+theta^(2+i)    (1+x)theta^(2+i)   ... (a_(q-1))+theta^(2+i)
(0)+theta^(3+i)    (1)+theta^(3+i)     (2)+theta^(3+i)     (x)+theta^(3+i)    (1+x)theta^(3+i)   ... (a_(q-1))+theta^(3+i) 
...                ...                 ...                 ...                ...                ...
(0)+theta^(q-2+i)  (1)+theta^(q-2+i)   (2)+theta^(q-2+i)   (x)+theta^(q-2+i)  (1+x)theta^(q-2+i) ... (a_(q-1))+theta^(q-2+i) 

Несколько вещей, чтобы отметить здесь. Я выбрал произвольные элементы (0), (1), (2), (x), (1 + x) и др. c. которые принадлежат конечной группе цикли c порядка q ^ p, где q - простое число. Элементы в этой циклической группе c, скажем, F [x], являются полиномами вплоть до степени (p-1) с коэффициентами в диапазоне от 0 до (q-1). Фактически, коэффициенты и, следовательно, полиномы находятся под (mod q).

Я пытался построить свой собственный алгоритм для создания квадрата с использованием этого шаблона. Предполагая, что у меня есть генератор (который мне еще предстоит выяснить, как кодировать), я могу выполнить следующее, чтобы получить каждый элемент вышеуказанного квадрата. (Обратите внимание, что я сохраняю матричные элементы в списке, потому что каждый элемент в матрице на самом деле является полиномом.)

F <- as.matrix(expand.grid(lapply(1:p, function(i) 1:q-1L))) #obtains all possible combinations of polynomials up to degree p-1 under (mod q)

polylongdiv <- function(n,d) { #I found this online
    gd <- length(d)
    pv <- vector("numeric", length(n))
    pv[1:gd] <- d
    if ( length(n) >= gd ) {
      q <- c()
      while ( length(n) >= gd ) {
        q <- c(q, n[1]/pv[1])
        n <- n - pv * (n[1]/pv[1])
        n <- n[2:length(n)]
        pv <- pv[1:(length(pv)-1)]
      }
      list(q=q, r=n)
    } else {
      list(q=c(0), r=n)
    }
  }
  gen <- c(0,1) #Since I was testing this algorithm for the case q=2,p=2, the generator of F_8[x] is 0 + x, or c(0,1)
#ideally, I would like to determine the generator in this algorithm rather than calculating by hand

  LS <- list()
  i <- 1 #in case you are curious about the math, we can generate q-1 unique Latin Squares using this technique

  for(i in 1:(q^p)){ #for the first row, we just have each element; this seems to work fine
    LS[[i]] <- F[i,]%%q
  }

  for(k in (q^p+1):q^(2*p)){ #this provides the right dimension for the Latin Square
    for(i in 1:q^p){ #this is where things don't work anymore
      for(j in 0:(q-2)){
        LS[[k]] <- (F[i,] + gen^(j+sub))%%q
      }
    }
  }

Вы можете заметить, что я включил алгоритм полиномиального длинного деления. Это потому, что полиномы элементов в латинском квадрате не могут превышать степень p-1. (Пример: после применения общего шаблона, когда p = 2, q = 2, i = 1 и генератор 0 + x, третья строка, элемент столбца столбца будет 1 + x ^ 2, но мы не можем иметь многочлен степени 2 Таким образом, мы используем полиномиальное длинное деление, чтобы выяснить, что x ^ 2 = 1 + x в (mod2). Это кажется самой сложной частью для реализации в этом алгоритме для меня.)

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