< Return to Video

algoritmos aritméticos (13 min)

  • 0:00 - 0:05
    A próxima coisa que vamos olhar é como calcular modulares inteiros grandes. Assim
  • 0:05 - 0:09
    a primeira pergunta é: como podemos representar inteiros grandes em um computador? Então, isso é
  • 0:09 - 0:14
    na verdade, bastante simples. Então, imagine que estamos em uma máquina de 64 bits, o que
  • 0:14 - 0:18
    gostaria de fazer é que iria quebrar o número que deseja representar, em 32 bits e baldes
  • 0:18 - 0:23
    , em seguida, iremos basicamente tem esses n/32 baldes de bits, e juntos eles vão
  • 0:23 - 0:27
    representam o número que deseja armazenar no computador. Agora, devo mencionar
  • 0:27 - 0:31
    que eu só estou dando de 64 bits registra como um exemplo. Na verdade, muitos moderna
  • 0:31 - 0:35
    processadores têm 128 registros bits ou mais, e você pode até fazer multiplicações em
  • 0:35 - 0:39
    -los. Então, normalmente, você realmente usar blocos muito maiores do que apenas 32 bits. O
  • 0:39 - 0:43
    razão, a propósito, você quer limitar-se a 32 bits é assim que você pode
  • 0:43 - 0:47
    multiplicar dois blocos juntos, eo resultado será ainda menos de 64 bits,
  • 0:47 - 0:51
    menor do que o tamanho de palavra sobre a máquina. Então, agora vamos olhar para aritmética particular
  • 0:51 - 0:55
    operações e ver quanto tempo cada um leva. Então, adição e subtração
  • 0:55 - 0:59
    basicamente o que você gostaria de fazer é que a adição ou subtração levaria seria
  • 0:59 - 1:03
    emprestado e esses são basicamente as operações de tempo linear. Em outras palavras, se você quiser
  • 1:03 - 1:07
    adicionar ou subtrair dois números inteiros n pouco o tempo de execução é basicamente
  • 1:07 - 1:13
    linear em n. Multiplicação ingenuamente vai levar tempo quadrático. Na verdade,
  • 1:13 - 1:17
    isso é que é chamado de algoritmo de ensino médio. Este é o tipo de você
  • 1:17 - 1:21
    aprendeu na escola, onde se você pensar sobre isso por um minuto você vai ver que,
  • 1:21 - 1:26
    que o algoritmo é basicamente quadrática no comprimento dos números que estão a ser
  • 1:26 - 1:30
    multiplicado. Assim, uma grande surpresa na década de 1960 era um algoritmo devido a Karatsuba que
  • 1:30 - 1:34
    realmente atinge muito melhor do que o tempo quadrática de facto, ter atingido um
  • 1:34 - 1:39
    tempo de execução de n para o 1,585. E não há realmente nenhum ponto em me mostrar
  • 1:39 - 1:43
    como o algoritmo efectivamente trabalhadas, vou apenas mencionar a idéia principal que
  • 1:43 - 1:48
    Karatsuba percebi, é que na verdade, quando você quer multiplicar dois números, você pode
  • 1:48 - 1:53
    gravá-los como, você pode pegar o primeiro número x, escrevê-lo como 2 às vezes b
  • 1:53 - 1:58
    x2 mais x1. Onde X1 X2 e são aproximadamente o tamanho da raiz quadrada de x. Ok, então
  • 1:58 - 2:03
    podemos tipo de quebrar o número x em parte esquerda da x ea parte direita de x.
  • 2:03 - 2:08
    E, basicamente, você está escrevendo x como se fosse escrito à base 2 b. Então, ele tem
  • 2:08 - 2:12
    base de dois dígitos 2 a b. E você faz a mesma coisa com, y. Você escreve de base y
  • 2:12 - 2:17
    2 para o b. Mais uma vez, que iria escrever-lo como, a soma de a metade esquerda da adição
  • 2:17 - 2:22
    meia direita, e então, normalmente, se você tentar fazer essa multiplicação, quando você abre
  • 2:22 - 2:27
    os parênteses. Você vê que, isso exigiria 4 multiplicações, certo?
  • 2:27 - 2:33
    Seria necessário x2 vezes y2, x2 vezes y1, y2 x1 vezes e vezes x1 y1. O que
  • 2:33 - 2:40
    Karatsuba percebi é que há uma maneira de fazer essa multiplicação de x por y utilizando apenas
  • 2:40 - 2:46
    três multiplicações de x1 x2 y1 y2. Então é só uma multiplicação grande de x vezes y
  • 2:46 - 2:50
    leva apenas três multiplicações pequenos. Você pode agora recursivamente
  • 2:50 - 2:55
    aplicar exactamente o mesmo procedimento para a multiplicação por x2 y2, e x2 por y1, e assim
  • 2:55 - 3:00
    sobre e assim por diante. E você teria este algoritmo recursivo. E se você fizer o
  • 3:00 - 3:05
    análise recursiva, você vai ver que, basicamente, você tem um tempo de execução de n para o 1,585.
  • 3:05 - 3:14
    Este número é, basicamente, a 1,585 é basicamente, faça de 3 de base 2.
  • 3:14 - 3:18
    Surpreendentemente, verifica-se que Karatsuba não é mesmo o melhor de multiplicação
  • 3:18 - 3:24
    algoritmo lá fora. Acontece que, na verdade, você pode fazer a multiplicação em cerca de n * log do tempo (n).
  • 3:24 - 3:29
    Então você pode fazer a multiplicação quase em tempo linear. No entanto, este é um resultados extremamente assintóticas.
  • 3:29 - 3:31
    O O grande aqui esconde constantes muito grandes. E como um
  • 3:31 - 3:35
    resultado, este algoritmo só se torna prático quando os números são absolutamente
  • 3:35 - 3:39
    enorme. E assim este algoritmo não é realmente usado com muita freqüência. Mas
  • 3:39 - 3:43
    algoritmo Karatsuba é muito prático. E na verdade a maioria, cripto-bibliotecas
  • 3:43 - 3:48
    implementar algoritmo Karatsuba para multiplicação. No entanto, para simplicidade
  • 3:48 - 3:52
    aqui, eu só vou ignorar algoritmo Karatsuba, e apenas para simplificar, eu sou
  • 3:52 - 3:56
    vou assumir que a multiplicação é executado em tempo quadrático. Mas em sua mente, você
  • 3:56 - 4:00
    deve ser sempre pensando que tudo multiplicação realmente é um pouco mais rápido do que quadrático.
  • 4:00 - 4:05
    E então a pergunta seguinte, depois de multiplicação é o que acontece com
  • 4:05 - 4:10
    divisão com resto e verifica-se que também é um algoritmo de tempo quadrático.
  • 4:10 - 4:15
    Assim, a principal operação que permanece, e que nós usamos muitas vezes até agora, e
  • 4:15 - 4:20
    Eu nunca, na verdade, nunca, nunca te disse como realmente computá-lo, isso é
  • 4:20 - 4:26
    questão de exponenciação. Então, vamos resolver este problema exponenciação um pouco mais
  • 4:26 - 4:32
    abstratamente. Então, imagine que temos um grupo cíclico finito G. Tudo isso significa é que
  • 4:32 - 4:37
    este grupo é gerada a partir dos poderes de alguns g gerador pouco. Assim, por exemplo
  • 4:37 - 4:43
    pensar desse grupo como simplesmente * ZP, e acho que de g pouco como alguns gerador de
  • 4:43 - 4:49
    grande G. A razão que eu estou sentado, desta forma, é que eu sou, eu quero que você começar a se acostumar
  • 4:49 - 4:54
    para essa abstração onde lidamos com um genérico grupo G e * ZP é realmente apenas
  • 4:54 - 4:59
    um exemplo de um tal grupo. Mas, na verdade, existem muitos outros exemplos de finito
  • 4:59 - 5:03
    grupos cíclicos. E novamente eu quero ênfase basicamente que o grupo G, tudo o que
  • 5:03 - 5:08
    é, é simplesmente este poderes deste gerador até ao fim do grupo.
  • 5:08 - 5:15
    vou escrevê-lo como G para o P. Portanto, nossa meta agora é dado este elemento g, e alguns
  • 5:15 - 5:21
    expoente x, nosso objetivo é calcular o valor de g para o x. Agora, normalmente o que você
  • 5:21 - 5:25
    diria que é, você pensaria bem, você sabe, se x é igual a 3 então eu sou
  • 5:25 - 5:29
    vai computar que você sabe, g em cubos. Bem, não há realmente nada a fazer. Tudo o que faço é
  • 5:29 - 5:33
    Eu só faço g vezes g g vezes e eu fico g cubo, que é o que eu queria. Então, isso é
  • 5:33 - 5:37
    realmente muito fácil. Mas, na verdade, isso não é o caso que nós estamos interessados dentro Em
  • 5:37 - 5:41
    nosso caso, os nossos expoentes vão ser enormes. E então se você tentar, você sabe,
  • 5:41 - 5:46
    pensar como um número de 500-bit e por isso, se você tentar calcular g para o poder de um
  • 5:46 - 5:51
    número 500-bit simplesmente multiplicando g por g por g por g isso vai levar um bom
  • 5:51 - 5:56
    enquanto. Na verdade isso vai levar tempo exponencial que não é algo que queremos
  • 5:56 - 6:01
    fazer. Portanto, a questão é se ainda que x é enorme, ainda podemos calcular
  • 6:01 - 6:06
    g ao x relativamente rápido ea resposta é sim e o algoritmo que faz isso
  • 6:06 - 6:11
    é chamado um algoritmo de quadratura repetida. E então deixe-me mostrar-lhe como repetido
  • 6:11 - 6:16
    obras esquadria. Então, vamos tomar como exemplo, de 53 anos. Ingenuamente, você teria que fazer
  • 6:16 - 6:20
    53 multiplicações de g por g por g por g até chegar ao g por 53, mas eu quero
  • 6:20 - 6:25
    mostrar como você pode fazê-lo muito rapidamente. Então o que vamos fazer é que vou escrever 53 em
  • 6:25 - 6:30
    binário. Então aqui é a representação binária de 53. E tudo isso significa
  • 6:30 - 6:36
    é, você percebe isso, corresponde a 32, esta corresponde a 16, este
  • 6:36 - 6:41
    corresponde a 4, e este corresponde a 1. Então, realmente é 32 53
  • 6:41 - 6:47
    mais 16 mais 4 mais 1. Mas o que isto significa é que g ao poder de 53 é
  • 6:47 - 6:52
    g para o poder de 32 16 4 1. E nós podemos quebrar essa para cima, usando mais uma vez, as regras de
  • 6:52 - 6:57
    exponenciação. Podemos quebrar isso como g para o g 32 vezes para o g 16 vezes para o
  • 6:57 - 7:03
    4 vezes g para o 1, agora que deve começar a dar uma idéia de como calcular g para
  • 7:03 - 7:07
    a 53 muito rapidamente. O que vamos fazer é, simplesmente, vamos g e vamos começar
  • 7:07 - 7:11
    quadratura-lo. Então, o que quer praça, quer para obter g g quadrado. Nós quadrado novamente para
  • 7:11 - 7:16
    obter g para o 4, desligue g para o 8. Ligue g para o 16, g para o 32. Assim
  • 7:16 - 7:21
    nós computados todos esses quadrados de g. E agora, o que vamos fazer é que estamos simplesmente
  • 7:21 - 7:26
    vai multiplicar os poderes adequados para poder nos dar a g para o 53. Portanto, esta é a g
  • 7:26 - 7:30
    os um vezes g às 4 vezes g às 16 vezes g para o 32, é basicamente
  • 7:30 - 7:35
    vai nos dar o valor que queremos, que é g para o 53. Então aqui você vê que
  • 7:35 - 7:40
    tudo o que tínhamos a fazer era apenas calcular, vamos ver, tivemos que fazer um, dois, três, quatro,
  • 7:40 - 7:49
    quadratura cinco, além de quatro multiplicações mais com 9 multiplicações nós computadorizada g
  • 7:49 - 7:54
    ao 53. Ok então isso é muito interessante. E acontece que este é um
  • 7:54 - 7:58
    fenômenos gerais, que nos permite levantar g de poderes muito, muito altas e fazê-lo muito
  • 7:58 - 8:03
    rapidamente. Então deixe-me mostrar-lhe o algoritmo, como eu disse isso é chamado de repetidas
  • 8:03 - 8:06
    algoritmo de quadratura. Assim, a entrada para o algoritmo é o elemento g eo
  • 8:06 - 8:11
    expoente x. Ea saída é g para o x. Então o que vamos fazer é que nós vamos
  • 8:11 - 8:15
    x escrever em notação binária. Então vamos dizer que x tem n bits. E esta é a real
  • 8:15 - 8:20
    representação de bits de x como um número binário. E então o que vamos fazer é o
  • 8:20 - 8:24
    seguinte. Nós vamos ter estes dois registos. y vai ser um registo que é constantemente
  • 8:24 - 8:28
    quadrado. E então z vai ser um acumulador que se multiplica no
  • 8:28 - 8:33
    poderes apropriados de g, conforme necessário. Então, tudo o que fazemos é o loop através do seguinte
  • 8:33 - 8:37
    bits de x a partir dos bits menos significativos e, então, fazer o
  • 8:37 - 8:41
    seguinte: em cada iteração estamos simplesmente indo y quadrado. Ok, então y só continua a
  • 8:41 - 8:46
    quadratura a cada iteração. E, em seguida, sempre que o bit correspondente do
  • 8:46 - 8:51
    expoente x passa a ser um, simplesmente acumular o valor atual de y em
  • 8:51 - 8:55
    este z acumulador e, em seguida, no final, simplesmente saída z. É isso aí. Essa é a
  • 8:55 - 9:00
    algoritmo inteiro, e isso é o algoritmo de quadratura repetida. Então, vamos ver um
  • 9:00 - 9:04
    exemplo, com o G 53. Assim, você pode ver as duas colunas. y é um
  • 9:04 - 9:08
    coluna, à medida que evolui através das iterações, e Z é uma outra coluna, de novo
  • 9:08 - 9:13
    à medida que evolui através das iterações. Assim, y não é muito interessante. Basicamente, tudo
  • 9:13 - 9:17
    que acontece com y é que a cada iteração, ele simplesmente fica quadrado. E assim
  • 9:17 - 9:22
    ele só anda pelas potências de dois e os expoentes e é isso. z é a
  • 9:22 - 9:27
    registo mais interessante onde o que ele faz é que acumula o adequado
  • 9:27 - 9:32
    poderes de g sempre que o bit correspondente ao expoente é um. Assim, por exemplo o
  • 9:32 - 9:36
    primeiro bit do expoente é um, portanto, o, no final do primeiro
  • 9:36 - 9:41
    iteração do valor de z é simplesmente igual ao g. O segundo bit do expoente é igual a zero
  • 9:41 - 9:46
    para que o valor de z não muda após a segunda iteração. E no final do
  • 9:46 - 9:52
    terceira iteração bem o terceiro bit do expoente é um modo que se acumulam ao g
  • 9:52 - 9:57
    quarto em z. O próximo bit do expoente é zero para z não muda. O
  • 9:57 - 10:02
    próximo bit do expoente é um só e agora nós somos supostos para acumular o anterior
  • 10:02 - 10:07
    valor de y na z acumulador então deixe-me perguntar-lhe então o que vai ser o valor de z?
  • 10:11 - 10:14
    Bem, nós simplesmente acumular g aos 16 em z e assim nós simplesmente calcular a soma
  • 10:14 - 10:20
    , de 16 e 5 g de chegarmos a 21. Finalmente, o último bit é também definido como um
  • 10:20 - 10:25
    assim que nós acumulá-lo em z, fazemos 32 mais 21 e ficamos com a saída g, finalmente, para o 53.
  • 10:25 - 10:30
    Ok, então isso dá uma idéia de como isso funciona algoritmo repetidas esquadria.
  • 10:30 - 10:36
    É um algoritmo é bastante interessante e que nos permite calcular enormes poderes de
  • 10:36 - 10:41
    g muito, muito, muito rapidamente. Portanto, o número de iterações aqui, essencialmente, seria
  • 10:41 - 10:46
    log base 2 de x. Okay. Você percebe o número de iterações simplesmente depende da
  • 10:46 - 10:52
    número de dígitos de x, que é basicamente a base 2 log de x. Assim, mesmo se x é um
  • 10:52 - 10:57
    bit número 500 em 500 multiplicação, bem, 500 iterações, realmente 1000
  • 10:57 - 11:02
    multiplicações porque temos de conciliar e nós temos que acumular. Assim, em 1000
  • 11:02 - 11:07
    multiplicações nós vamos ser capazes de levantar g para a potência de um expoente bit 500.
  • 11:07 - 11:13
    tipo Ok então agora podemos resumir os tempos de execução para supor que
  • 11:13 - 11:18
    ter um pouco de capital módulo N N como dissemos adição e subtração em ZN leva
  • 11:18 - 11:22
    tempo linear. Multiplicação de apenas, você sabe, como eu disse, Karatsuba na verdade torna essa
  • 11:22 - 11:27
    mais eficiente, mas para simplificar, vamos apenas dizer que é preciso tempo quadrático. E
  • 11:27 - 11:32
    exponenciação, então, como eu disse, basicamente leva log de iterações x, e em cada
  • 11:32 - 11:36
    iteração, basicamente, fazer duas multiplicações. Então, é O (log (x))
  • 11:36 - 11:40
    vezes o tempo para se multiplicar. E digamos que o tempo para multiplicar é quadrática. Assim
  • 11:40 - 11:45
    tempo a execução seria, realmente, N x log quadrados. E desde que x é sempre vou
  • 11:45 - 11:49
    ser inferior a N, pelo teorema de Fermat não há nenhum ponto em levantar g para uma potência
  • 11:49 - 11:54
    que é maior do que o módulo. Assim x vai ser inferior a N. Vamos supor que x
  • 11:54 - 11:59
    também é um número inteiro N-bits, então, realmente exponenciação é um algoritmo de cúbico-tempo.
  • 11:59 - 12:03
    Ok é isso que eu queria que você se lembre, que a exponenciação é realmente
  • 12:03 - 12:07
    uma relativamente lenta. Esses dias, ele realmente leva alguns microssegundos em um moderno
  • 12:07 - 12:11
    computador. Mas ainda assim, microssegundos para um, para uma, digamos, um processador de quatro é gigahertz
  • 12:11 - 12:15
    um pouco de trabalho. E assim, basta ter em mente que tudo o exponenciação
  • 12:15 - 12:20
    operações que falamos. Por exemplo, para determinar se um número é um quadrática
  • 12:20 - 12:24
    resíduo ou não, todos aqueles que, todos aqueles exponenciações, basicamente, ter tempo cúbico.
  • 12:25 - 12:30
    Ok, então que completa a nossa discussão de algoritmos aritméticos, e depois na
  • 12:30 - 12:34
    próximo segmento nós vamos começar a falar de problemas de disco rígido, modulo, primos e compostos.
Title:
algoritmos aritméticos (13 min)
Video Language:
English
erickshowplay added a translation

Portuguese, Brazilian subtitles

Revisions