CENTRO FEDERAL DE EDUCAÇÃO
TECNOLÓGICA DE MINAS GERAIS
Diretoria de Pesquisa e Pós-Graduação
Programa de Mestrado em Modelagem
Matemática e Computacional
Roteamento em Redes Interligadas
modeladas por Grafos Circulantes e
Gaussianos
Dissertação de Mestrado, submetida ao Programa
de Pós-Graduação em Modelagem Matemática e
Computacional, como parte dos requisitos exigidos
para a obtenção do título de Mestre em Modelagem Matemática e Computacional.
Aluno: Luiz Otávio Rodrigues Alves Sereno
Orientador: Prof. Dr. Rodrigo Tomás Nogueira Cardoso
Co-Orientadora: Prof.a Dra. Sandra Mara Alves Jorge
Belo Horizonte - MG
Fevereiro de 2012
Agradecimentos
A Deus pelo dom da vida e pela oportunidade de poder estudar e buscar a realização
dos meus sonhos!
Aos meus pais Luiz Fernando e Sueli por me ensinarem o caminho em que devo
andar e que ao continuar crescendo não me desvie dele. E a minha irmã Ana Claudia
por me ajudar a compreender melhor o signicado do termo família.
Aos meus orientadores Rodrigo e Sandra pela conança, apoio, ensinamentos,
por todo empenho, sabedoria, compreensão e, principalmente, exigência. Agradeço
também às professoras Dra. Ana Cristina Vieira e Dra. Elizabeth Fialho Wanner
por aceitarem o convite de compor a banca e pelas sugestões ao trabalho.
A minha namorada Sabrina pelo apoio de sempre e pelo incentivo incessante,
mesmo nos momentos de maior diculdade.
A minha prima Shirley e a seu marido Guilhereme por terem me recebido em
Belo Horizonte assim que cheguei e por terem me ajudado sempre que precisei. Ao
meu primo Antônio Carlos, sua esposa Aleice e toda sua família pela receptividade
e ajuda nas diculdades que encontrei na capital mineira.
Aos amigos que z no CEFET-MG nestes dois anos, pelas horas de estudos e por
tornarem bem melhores meus dias em BH. Agradeço em especial a Lillia, Jahína,
Gustavo, Flaviana, Carla, Jeanderson, Kay, Mayra, Moisés, Saulo, José Maurício,
Nilmar e a todos que compartilharam momentos bons e ruins no curso.
A CAPES pelo auxílio nanceiro durante a caminhada.
Finalmente, agradeço a todas as pessoas que, direta ou indiretamente, contribuíram para a execução dessa Dissertação de Mestrado.
ii
Resumo
O objetivo principal deste trabalho é estudar o roteamento de redes interligadas
modeladas por diferentes topologias de grafos, pretendendo, por exemplo, tornar
mais eciente o cálculo das distâncias mínimas.
circulantes e os gaussianos.
Dois tipos foram escolhidos:
os
Com base na tese de Martínez (2007), é apresentado
um estudo teórico das estruturas matemáticas destes grafos, que são importantes
no desenvolvimento das ferramentas consideradas. Algoritmos ecientes são propostos para calcular o caminho mais curto entre dois vértices, e suas implementações
computacionais permitirão uma visualização gráca das redes e seus roteamentos
ótimos.
Além disso, a partir do artigo de Yanga (2009), estuda-se a construção
de árvores geradoras independentes para uma classe especial de grafos circulantes,
innalizando com uma extensão para grafos gaussianos em geral.
PALAVRAS-CHAVE: Grafo Gaussiano; Grafo Circulante; Redes interligadas;
Roteamento.
iii
Abstract
The main objective of this work is to study the routing of interconnected networks modelled by dierent graph topologies, intending, for example, become more
ecient the computation of minimal distances. Two types were chosen: the circulants and the gaussians. Based on the thesis of Martínez (2007), it is presented a
theoretical study of the mathematical structures of these graphs, which belong together in the development of the considered tools. Ecient algorithms are proposed
for calculate the shortest path between two vertices, and their computational implementations will permit a graphic visualization of the networks and their optimal
routings. Furthermore, from the Yanga's (2009) article, it studies the construction
of independent spanning trees for a special type of circulants graphs, completing
with an extension for gaussian graphs in general.
KEY-WORDS: Gaussian Network; Circulant Graph; interconnected networks;
Routing.
iv
Sumário
1 Anel dos Inteiros Gaussianos
2
1.1
Fatos Básicos
1.2
Anéis Quocientes de Inteiros Gaussianos
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
2 Grafos Circulantes e Gaussianos
2
8
12
2.1
Fatos básicos sobre Grafos . . . . . . . . . . . . . . . . . . . . . . . .
12
2.2
Grafos Circulantes
17
2.2.1
2.3
Algoritmo de Euclides Estendido
. . . . . . . . . . . . . . . .
18
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
Diâmetro e Distância média de um grafo Gaussiano . . . . . .
26
Grafos Gaussianos
2.3.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 O problema do caminho mais curto
3.1
3.2
Algoritmo de Dijkstra
Roteamento em Grafos Circulantes
3.2.1
3.3
. . . . . . . . . . . . . . . . . . .
Programa para Roteamento em Grafos Circulantes
38
38
. . . . . . . . . . . . . . . . . . .
41
Programa para Roteamento em Grafos Gaussianos . . . . . . .
43
4 O problema das árvores geradoras independentes
4.1
36
. . . . . .
Roteamento em Grafos Gaussianos
3.3.1
36
. . . . . . . . . . . . . . . . . . . . . . . . . .
46
4.2
Árvores Geradoras Independentes (IST)
. . . . . . . . . . . . . . . .
m
Construindo IST's em C(cd , d) com d > 2 . . . . . . . . . . . . . . .
56
4.3
Prova da vericidade do algoritmo
. . . . . . . . . . . . . . . . . . . .
60
4.4
IST's em grafos gaussianos . . . . . . . . . . . . . . . . . . . . . . . .
64
5 Conclusão e Trabalhos Futuros
46
67
5.1
Conclusão
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
5.2
Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
68
v
Lista de Tabelas
2.1
Distribuição de pesos no caso ímpar . . . . . . . . . . . . . . . . . . .
2.2
Distribuição de pesos no caso par com
2.3
Distribuição de pesos no caso par com
vi
a<b
a=b
30
. . . . . . . . . . . . . .
33
. . . . . . . . . . . . . .
33
Lista de Figuras
2.1
Exemplo de grafo com 7 vértices . . . . . . . . . . . . . . . . . . . . .
13
2.2
Modelagem de redes através de grafos . . . . . . . . . . . . . . . . . .
13
2.3
Exemplo de grafo de grau 3
14
2.4
Exemplo de dois grafos isomorfos
2.5
Grafo conexo
2.6
Grafo
2.7
Grafos isomorfos
2.8
Pontos cuja norma é igual à
2.9
Translações das Regiões
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
15
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
G = (D, E)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
|α| . . . . . .
Q, T, −T, iT e −iT
. . . . . . . . . . . . . . .
28
. . . . . . . . . . . . . .
30
2.10 Distribuição de pesos no grafo gaussiano gerado por 2 + 7i . . . . . .
2.11 Translações da Região
Qt−1 ,
Segmentos e Triângulo da Prova . . . . .
3.1
Grafo Circulante com 18 vértices e saltos 3 e 5 . . . . . . . . . . . . .
3.2
Menor caminho entre os vértices 1 e 12 do Grafo Circulante
|g|
e
|h|
C18 (3, 5)
3.3
Gráco das funções
3.4
Grafo Gaussiano gerado por
. . . . . . . . . . . . . . . . . . . . . . .
3.5
Grafo Gaussiano gerado por
3.6
Menor caminho entre os vértices 5+3i e 7+0i do grafo gaussiano
3.7
Menor caminho entre os vértices 5+3i e 7+0i do grafo gaussiano
5 + 8i
5 + 8i
. . . . . . . . . . . . . . . . . . .
na topologia losangular
31
32
39
39
40
43
. . . . . .
44
G3+5i
G3+5i
44
na topologia em L . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
4.1
Exemplo de caminhos disjuntos
46
4.2
Árvores Geradoras
4.3
C(18, 3) . . . . . . . . .
Grafo circulante recursivo C(18, 3)
. . . . . . . . .
m−1
Vértices adjacentes a j no grafo C(cd
, d) . . . .
Árvores Geradoras Independentes no grafo C(16, 4)
−
Árvore T0 do grafo C(18, 3) . . . . . . . . . . . . .
+
Árvore T0 do grafo C(18, 3) . . . . . . . . . . . . .
−
Árvore T1 do grafo C(18, 3) . . . . . . . . . . . . .
+
Árvore T1 do grafo C(18, 3) . . . . . . . . . . . . .
−
Árvore T2 do grafo C(18, 3) . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
. . . . . . . . . .
48
. . . . . . . . . .
49
. . . . . . . . . .
50
. . . . . . . . . .
52
. . . . . . . . . .
58
. . . . . . . . . .
58
. . . . . . . . . .
59
. . . . . . . . . .
59
. . . . . . . . . .
59
4.12 Árvore 2 gerada pelo programa
. . . . . . . . . . . . . . . . . . . . .
65
4.13 Árvore 3 gerada pelo programa
. . . . . . . . . . . . . . . . . . . . .
65
4.14 Árvore 4 gerada pelo programa
. . . . . . . . . . . . . . . . . . . . .
65
4.15 Árvore Geradora 2
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
4.16 Árvore Geradora 3
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
4.17 Árvore Geradora 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
Grafo circulante recursivo
vii
Introdução
Em todos os sistemas que fazem uso de redes interligadas, uma comunicação eciente entre os nós dessa rede torna-se necessária. A tarefa de enviar um conjunto
de dados de um ponto a outro pede uma busca pelo melhor caminho possível, ou
seja, aquele que dará menor custo. A esse processo chamamos de roteamento, que
iremos trabalhar ao longo deste trabalho em alguns tipos de redes. Numa rede de
computadores do tipo LAN (Local Area Network), por exemplo, a transmissão de
dados entre pontos da mesma deve se realizar de forma a percorrer o menor caminho
até chegar ao destino desejado.
Estas redes podem ser modeladas através de grafos, importantes objetos matemáticos que permitem também a modelagem de diversos outros problemas reais.
Entretanto, a busca de soluções para grafos em geral com baixo custo computacional
se torna complicada. Existem classes especícas de grafos que tratam problemas de
forma mais restrita, o que permite reduzir esse custo ao trabalhar com estruturas
mais conhecidas.
Neste trabalho, estudamos principalmente duas dessas classes:
os grafos circulantes, muito usados há algumas décadas, e grafos gaussianos, que
aparecem na literatura de forma mais recente e que, sob algumas condições, são
isomorfos aos primeiros.
A busca do menor caminho entre os vértices de um grafo, passando pelas arestas
pertencentes ao mesmo, é um dos principais problemas da Teoria de Grafos. Tratase de um dos mais conhecidos e antigos problemas na pesquisa operacional e sua
solução foi sugerida até mesmo em lendas mitológicas da Grécia Antiga. Ele aparece,
por exemplo, na robótica, onde são necessários bons algoritmos para navegação, e
está associado a um enorme número de outros problemas na área de roteamento,
manufatura, uxos em redes etc.
Ao longo dos anos, muitos algoritmos surgiram
para resolução desse problema. Existem na literatura alguns resultados e algoritmos,
como o proposto por Dijkstra em 1959, que pode ser utilizado em praticamente todos
os tipos de grafos, e o de Ford-Moore-Bellman, uma generalização do primeiro.
Apesar disso, o custo computacional desses algoritmos é elevado para problemas
com um número grande de vértices. Neste trabalho, propomos formas alternativas
de resolvê-lo, restritas às classes dos grafos circulantes e gaussianos com baixo custo
computacional.
A escolha da topologia é feita de forma que o grafo correspondente tenha bons
parâmetros, propriedades que caracterizam um grafo.
A inserção de mais arestas
garante, por exemplo, maior conectividade e, consequentemente, robustez. Entretanto, deve-se evitar um aumento do diâmetro do grafo, ou seja, a maior distância possível existente na combinação dois-a-dois de vértices.
Grafos circulantes e
grafos gaussianos são classes de grafos dotadas com topologias interessantes para
viii
0.0
1
a resolução do problema citado anteriormente. Os primeiros possuem alto grau de
conectividade e diâmetros aceitáveis, além de possuírem simetria. Já os últimos têm
a vantagem de possuírem como rótulos os seus vértices, isto é, o nome atribuído a
eles, os inteiros gaussianos, que são um subconjunto dos números complexos com a
parte real e a parte imaginária pertencentes aos inteiros, o que lhes dá uma forma
bastante conveniente de rotulação ao dispor os vértices no plano cartesiano.
Este trabalho apoia-se no estudo mais detalhado de Martínez (2007), tese de
doutorado com o título
Codes and Graphs over Complex Integer Rings,
e no artigo
Martínez (2008) da mesma autora, apresentando, inclusive, provas que não foram
explicitadas ou provas alternativas para alguns teoremas. As pesquisas que envolvem
os grafos Gaussianos apresentam-se de forma relativamente recente. Podemos citar,
On Shortest Disjoint Paths and Hamiltonian Cycles in Some
Interconnection Networks de Hussein (2011), que utiliza tais grafos em problemas
por exemplo, a tese
relacionados a encontrar caminhos com vértices disjuntos em certas classes de redes
interligadas.
Por último, trabalhamos com o problema da busca de árvores geradoras independentes, fazendo uma releitura do artigo de Yang (2009), que trata do caso de
grafos circulantes, em que se propõe um algoritmo para construção de árvores geradoras independentes para uma subclasse especíca desses grafos.
Estas árvores
são utilizadas, por exemplo, em transmissão e distribuição de mensagens em redes
interligadas. Finalizando o trabalho, é proposto um estudo sobre árvores geradoras
em grafos Gaussianos. Este mesmo problema também é tratado de forma mais recente pelo artigo Yang (2010), no caso particular dos grafos circulantes recursivos,
em que os parâmetros valem
d=2
e
c = 1.
Através do software MATLAB, foram desenvolvidos algoritmos que tratam do
roteamento de grafos circulantes e gaussianos, além de algoritmos que fazem a transição entre diferentes topologias de grafos gaussianos.
Também foram propostos
algoritmos para a busca de árvores geradoras independentes (IST's) em grafos circulantes recursivos e grafos gaussianos.
Capítulo 1
Anel dos Inteiros Gaussianos
O estudo de roteamento em redes interligadas, objetivo principal deste trabalho,
pode ser feito de maneira mais eciente através do uso de algumas classes especícas de grafos, nas quais baseiam-se no estudo do Anel dos Inteiros Gaussianos. Para
melhor compreensão desse anel, apresentamos neste capítulo algumas denições básicas do contexto de Álgebra Abstrata, juntamente com alguns resultados, que podem
ser encontrados em Gilbert (2004), Gonçalves (1979) e Hungerford (1997). Veremos,
por exemplo, que o anel dos Inteiros Gaussianos é um domínio euclidiano. Esta estrutura algébrica será utilizada na construção dos grafos Gaussianos, que veremos
mais tarde.
1.1
Fatos Básicos
Denição 1.1 Um grupo (G, ∗) é um conjunto junto com uma operação binária ∗
que satisfaz os seguintes axiomas.
(i) A operação ∗ é associativa; isto é, (a ∗ b) ∗ c = a ∗ (b ∗ c) para todos a, b, c ∈ G .
(ii) Existe um elemento neutro e ∈ G tal que e ∗ a = a ∗ e = a, para todo a ∈ G .
(iii) Cada elemento a ∈ G tem um elemento inverso a−1 ∈ G tal que a−1 ∗ a =
a ∗ a−1 = e.
Além disso, se a ∗ b = b ∗ a, ∀a, b ∈ G , dizemos que G é um grupo abeliano.
Pelo contexto, denotaremos
a∗b
por
ab.
Denição 1.2 Se G é um grupo e H é um subconjunto não-vazio de G , então H é
chamado subgrupo de G , denotado por H ≤ G , se ocorrerem as seguintes condições:
(i) ab ∈ H para todos a, b ∈ H .
(ii) a−1 ∈ H para todo a ∈ H .
Exemplo 1.1 O conjunto Z[i] = {a + bi|a, b ∈ Z} ⊂ C com a operação usual de
soma é um grupo.
2
1.1
Anel dos Inteiros Gaussianos
3
a ∈ G , dizemos que hai = {an |n ∈ Z} é o subgrupo cíclico
2
n
gerado por a. Note que se G é nito, então hai = {a, a , ..., a } para o n ∈ Z tal
n
que a = e. De modo mais geral, dado um subconjunto não-vazio S ⊆ G , denimos
o conjunto de todos os possíveis produtos, em qualquer ordem, dos elementos de S
e de seus inversos como sendo o subgrupo de G gerado por S , cuja notação é dada
por hSi.
Seja G um grupo e H ≤ G . Então dizemos que, para cada x ∈ G , Hx = {hx :
h ∈ H} é a classe lateral à direita de H em G .
Se criarmos a relação de equivalência em G tal que
Dado
G
um grupo e
x ∼ y ⇔ xy −1 ∈ H,
tem-se que:
x ∼ y ⇔ xy −1 = h ∈ H ⇔ x = hy ⇔ x ∈ Hy
Logo,
Hx
x.
f : H → Hx, que leva h em hx, vemos que f é uma bijeção.
classes laterais de H em G têm a mesma cardinalidade de H .
é a classe de equivalência de
Tomando a função
Assim, todas as
O conjunto das classes de equivalência é denotado por:
G/H = {Hx|x ∈ G}
Note que se G/H é nito, digamos, G/H = {Hx1 , Hx2 , . . . , Hxn }, então G =
Hx1 ∪ Hx2 ∪ . . . ∪ Hxn e Hxi ∩ Hxj = ∅, se i 6= j .
Com isso e denotando por |X| a cardinalidade de um conjunto X nito, podemos
provar o seguinte resultado:
Teorema 1.1 (Teorema de Lagrange): Se G é um grupo nito e H é um subgrupo
|G|
.
de G , então |H| divide |G| e |G/H| = |H|
Dem.: Considerando a relação de equivalência à direita em G , obtemos, como
vimos, uma partição de G em n classes de equivalência. Como cada uma dessas
|G|
classes possui |H| elementos, então |G| = n · |H|, ou seja, n = |H|
. Sendo n classes,
então |G/H| = n.
Denição 1.3 Dizemos que (A, +, ·) é um anel com as operações · e + se satisfaz
as propriedades:
(i) O conjunto A com a operação + forma um grupo abeliano.
(ii) A operação · é fechada em A.
(iii) Associatividade para multiplicação, isto é, (a · b) · c = a · (b · c), para todos
a, b, c ∈ A.
(iv) Distributividade da soma em relação à multiplicação, isto é, (a + b) · c =
a · c + b · c , para todos a, b, c ∈ A.
1.1
Anel dos Inteiros Gaussianos
4
Se além dessas propriedades, também valer a · b = b · a, para todos a, b ∈ A
(Comutatividade da multiplicação), então (A, +, ·) será um anel comutativo. Se
existir 1 ∈ A tal que 1 · a = a para qualquer elemento a ∈ A, então (A, +, ·) será
um anel com unidade.
Denição 1.4 Sejam G e H dois grupos.
(i) Um homomorsmo f : G → H é uma função tal que f (ab) = f (a)f (b) para
todos a, b ∈ G .
(ii) Um isomorsmo f : G → H é um homomorsmo bijetor.
Quando existe um isomorsmo entre os grupos G e H , dizemos que G e H são
isomorfos e denotaremos por G ∼
= H.
Analogamente, podemos introduzir os conceitos de homomorsmo e isomorsmo
entre anéis.
Denição 1.5 Sejam dois anéis R e S . Dizemos que f : R → S é um homomor-
smo de anéis, se f (a + b) = f (a) + f (b) e f (ab) = f (a)f (b). Além disso, R e S
são isomorfos, com notação R ∼
= S , se existir uma função f : R → S que seja um
isomorsmo, isto é, um homomorsmo bijetor.
Observe que, de acordo com a denição, se
f (0R ) = 0S ,
f
é um homomorsmo de anéis, então
ou seja, o elemento neutro da soma do primeiro anel é sempre levado
no elemento neutro do segundo.
Im(f ) de um
isomorsmo f : R → S da seguinte forma: Im(f ) = {f (x) ∈ S, x ∈ R}. Além disso,
denimos o conjunto N uc(f ) = {x ∈ R, f (x) = 0}, o chamado núcleo de f .
Assim como no contexto de funções reais, denimos a imagem
Denição 1.6 Dizemos que um anel é domínio de integridade se ele for comutativo,
com unidade e que nele a multiplicação de quaisquer dois elementos não-nulos é nãonula, ou seja, se a, b ∈ A são não-nulos, então a · b 6= 0, onde 0 é o elemento neutro
da adição.
Exemplo 1.2
√ Seja m ∈ Z − {0, 1} um número livre de quadrados. Considere A =
Dm = {a + b m/a, b ∈ Z}. Então:
(i) A é um domínio de integridade com Z ⊆ A ⊆ C. √
(ii) Tomando m = −1, temos o domínio D−1 = {a + b −1/a, b ∈ Z} = {a +
bi/a, b ∈ Z} = Z[i], chamado o Anel dos Inteiros de Gaussianos.
Denição 1.7 Seja (A, +, ·) um anel. Então ∅ 6= I ⊆ A será um ideal de A se
0 ∈ I , a + (−b) ∈ I , para todos a, b ∈ I e se dado x ∈ I , então para qualquer
elemento a ∈ A valer x · a ∈ I e a · x ∈ I .
1.1
Anel dos Inteiros Gaussianos
5
a ∈ A, I = (a) = {x · a|x ∈ A}, se o anel A for comutativo, I é
um ideal de A gerado por um único elemento. I é dito um ideal principal.
Dados A um anel e I um ideal de A, denimos, para cada a ∈ A, a classe de I em
A, a+I = {a+x|x ∈ I}. Note que a−b ∈ I se, e somente, se a+I = b+I . Denotamos
por A/I = {a+I|a ∈ A}, o conjunto de todas as classes laterais. Verica-se que A/I
herda uma estrutura de anel mediante as operações (a + I) + (a0 + I) = (a + a0 ) + I
e (a + I) · (a0 + I) = (a · a0 ) + I de sorte que a aplicação denida naturalmente por
h : A → B tal que h(a) = a + I seja um homomorsmo.
Note que dado
Exemplo 1.3 Se α ∈ Z[i], então (α) e (αα) são ideais de Z[i] e (ᾱα) é ideal de
(α). Logo,
(α)
(αα)
é ideal de
Z[i]
(αα)
.
Teorema 1.2 (Primeiro Teorema do Isomorsmo) Seja ϕ : A → S um hoA
∼
momorsmo de anéis. Então N uc(ϕ)
= Im(ϕ).
A
Dem.: Dena φ : N uc(ϕ) → Im(ϕ), dada por φ(r + N uc(ϕ)) = ϕ(r).
A função φ está bem denida e é um homomorsmo. De fato, como ϕ é homomorsmo, então φ também é homomorsmo e r + N uc(ϕ) = r0 + N uc(ϕ) implica r − r0 ∈ N uc(ϕ), ou seja, ϕ(r − r0 ) = 0. Sendo ϕ um homomorsmo vale
ϕ(r) − ϕ(r0 ) = 0, isto é, ϕ(r) = ϕ(r0 ).
Provemos que φ é bijetora. Para isso, note que se r + N uc(ϕ) ∈ N uc(φ), então
φ(r + N uc(ϕ)) = 0. Assim, ϕ(r) = 0 e r ∈ N uc(ϕ). Logo, r + N uc(ϕ) = N uc(ϕ) e
N uc(φ) = {0 + N uc(ϕ)}. Portanto, φ é injetora e, por denição, φ é sobrejetora.
A
∼
Assim, podemos concluir que φ é um isomorsmo, o que nos dá N uc(ϕ)
= Im(ϕ).
Teorema 1.3 (Terceiro Teorema do Isomorsmo) Sejam I, J ideais do anel
∼ A.
é ideal de AJ e A/J
I/J = I
Dem.: Primeiramente, note que:
i) JI 6= ∅, pois 0 + J ∈ JI .
ii) a + J, a0 + J ∈ JI implica (a + J) − (a0 + J) = (a − a0 ) + J ∈ JI .
iii) Se a+J ∈ JI e r+J ∈ AJ , então (a+J)(r+J) = ar+aJ +Jr+J = ar+J ∈ JI ,
pois I, J são ideais de A.
Dos itens anteriores, concluímos que JI é ideal de AJ .
Agora dena ϕ : AJ → AI , sendo ϕ(r + J) = r + I . ϕ está bem denida e é um
homomorsmo. Além disso, N uc(ϕ) = JI .
Se r + J ∈ N uc(ϕ), então ϕ(r + J) = 0 + I . Daí, r + I = 0 + I e, dessa forma,
r ∈ I . Portanto, r+J ∈ JI . Se a+J ∈ JI , então a ∈ I ⊆ A e ϕ(a+J) = a+I = 0+I .
Logo, a + J ∈ N uc(ϕ).
ϕ é sobrejetora. De fato, se r + I ∈ AI , então r + J ∈ A
e ϕ(r + J) = r + I .
J
A/J
∼
Pelo Primeiro Teorema do Isomorsmos, temos: N uc(ϕ) = Im(ϕ) = AI . Portanto,
A/J ∼ A
.
I/J = I
A, com J ⊆ I . Então:
I
J
1.1
Anel dos Inteiros Gaussianos
Exemplo 1.4 Se α ∈ Z[i], temos que
6
é ideal de (Z[i]
e, no contexto de gruᾱα)
é subgrupo do grupo (Z[i]
, que é nito (veja Teorema 1.6). Portanto, dos
pos, ((α)
ᾱα)
ᾱα)
Teoremas 1.1 e 1.3, temos:
Z[i]
(αα)
(α)
(αα)
∼
=
Z[i]
(α)
e
(α)
(ᾱα)
Z[i]
| (αα) |
(α)
| (αα) |
|.
= | Z[i]
(α)
A seguir, recordemos o conceito de um importante domínio na álgebra abstrata:
os domínios euclidianos.
Denição 1.8 Seja A um anel. Dizemos que A é um domínio euclidiano se A é
um domínio de integridade e se existe uma função: N : A − {0} → Z tal que:
(i) N (a) ≥ 0, para todo a ∈ A − {0}.
(ii) N (a) ≤ N (ab), para todos a, b ∈ A − {0}.
(iii) Dados quaisquer a, b ∈ A, b 6= 0, existem q, r ∈ A tais que a = bq + r e
r = 0 ou N (r) < N (b).
Dado um domínio euclidiano, um fato importante é que faz sentido denirmos
máximo divisor comum entre quaisquer dois de seus elementos.
x, y ∈ A,
y = cx.
Consideremos, para
existe
c∈A
tal que
a notação
x|y
(lê-se
x
divide
y)
para indicar que
Denição 1.9 Seja A um domínio euclidiano e a, b ∈ A (ambos não-nulos). Um
máximo divisor comum de a e b é um elemento d tal que:
(i) d|a e d|b
(ii) Se c|a e c|b, então N (c) ≤ N (d).
Se d é um máximo divisor comum de a e b, então denotaremos d por d =
mdc(a, b).
Exemplo 1.5 Os inteiros Z, com a norma usual de módulo constituem um domínio
euclidiano. Além disso, o Anel dos Inteiros Gaussianos Z[i] = {a+bi/a, b ∈ Z} é um
domínio euclidiano com a função N : Z[i] → N tal que N (a + bi) = a2 + b2 . Note que
N (α) > 0, ∀α ∈ Z[i] − {0}. Além disso, para quaisquer α, β ∈ Z[i] tem-se N (α) ≤
N (α)N (β) = N (αβ), onde a desigualdade deve-se ao fato de N (β) ≥ 1 seja qual
for β ∈ Z[i]. Sejam α, β ∈ Z[i], com β 6= 0. Então αβ = x + iy ∈ C. Existem
e, f ∈ Z tais que |x − e| ≤ 12 e |y − f | ≤ 21 . Dena δ = e + if ∈ Z[i] e considere
ρ = α − βδ = β( αβ − δ). Assim, N (ρ) = N (β)N ( αβ − δ) = N (β)N (x + iy − e − if ) =
N (β)N (x − e + i(y − f )) = N (β)[(x − e)2 + (y − f )2 ] ≤ N (β)( 41 + 14 ) = N 2(β) < N (β).
Logo, α = βδ + ρ, onde N (ρ) < N (β).
Não é difícil ver que o máximo divisor comum existirá para quaisquer dois elementos de
A
pertencentes a um domínio euclidiano. Um outro fato necessário para
1.1
Anel dos Inteiros Gaussianos
7
o nosso trabalho é o teorema seguinte. Porém, antes de enunciá-lo e prová-lo, lembremos que dado
tal que
uv = 1A .
unidade, tal que
A
um anel, um elemento
Além disso, dizemos que
u ∈ A é unidade em A, se existir v ∈ A
a, b ∈ A são associados se existe u ∈ A,
a = bu.
Teorema 1.4 Seja A um domínio euclidiano e a, b ∈ A (ambos não-nulos). Se
d = mdc(a, b), então
(i) Todo associado de d é também um máximo divisor comum de a e b.
(ii) Existem x0 , y0 ∈ A tais que d = ax0 + by0 .
(iii) Se existirem x0 , y0 ∈ A tais que 1A = ax0 + by0 , então mdc(a, b) = 1A , isto
é, a e b são relativamente primos.
Dem.:
(i) Seja d1 um elemento associado de d. Então d = d1 u, onde u é unidade de A.
Como d|a e d|b, temos a = dt e b = dt1 , ou seja, a = d1 ut e b = d1 ut1 . Portanto,
d1 |a e d1 |b. Agora se c|a e c|b, então N (c) ≤ N (d) = N (d1 u) = N (d1 ), pois u é
unidade de A. Assim, d1 = mdc(a, b).
(ii) Seja S = {N (w)|0 6= w ∈ Aew = as + bt, para algum s, t ∈ A} ⊂ N. Como
a = a1A + b0A ou b = a0A + b1A é não-nulo, segue que S 6= ∅. Pelo princípio
da boa ordenação, S tem um menor elemento, ou seja, existem d1 , x1 , y1 ∈ A tais
que d1 = ax1 + by1 e que para todo w ∈ A tal que w = as + bt, s, t ∈ A, tem-se
N (d1 ) ≤ N (w). É verdade que d1 = mdc(a, b). De fato, existem q, r ∈ A tais que
a = d1 q+r, onde r = 0 ou N (r) < N (d1 ) implica que r = a−d1 q = a−(ax1 +by1 )q =
a(1 − qx1 ) + b(−y1 q).
Assim, se r 6= 0, então r ∈ S e, assim, N (d1 ) ≤ N (r), o que é absurdo. Logo,
r = 0 e a = d1 q , isto é, d1 |a. Analogamente, d1 |b. Agora se c|a e c|b, então a = ct
e b = ck , t, k ∈ A e d1 = ax1 + by1 = ctx1 + cky1 = c(tk1 + ky1 ), o que implica
que N (c) ≤ N (c(tx1 + ky1 )) = N (d1 ). Logo, d1 é um máximo divisor comum de a e
b. Não é difícil mostrar que quaisquer dois máximos divisores comuns de a e b são
associados. Assim, d = d1 u, u é unidade de A, e d = (ax1 + by1 )u, o que nos dá
d = a(x1 u) + b(y1 u). Portanto, temos d = ax0 + by0 , onde x0 = x1 u, y0 = y1 u.
(iii) Suponha que existam x0 , y0 ∈ A tais que 1A = ax0 + by0 . Como d =
mdc(a, b), então d|a e d|b. Logo, a = dt e b = dk, t, k ∈ A. Assim, 1A = dtx0 +dky0 ,
ou ainda, 1A = d(tx0 + ky0 ). Portanto, d é uma unidade de A e 1A = mdc(a, b).
Observação 1.1 Em particular, o resultado do Teorema 1.4 é válido para o anel
dos números inteiros Z e para o Anel dos Inteiros Gaussianos Z[i].
ax + by = c, as chamadas equações diofantinas,
a e b não nulos. Procuremos soluções
x0 , y0 ∈ Z tais que ax0 + by0 = c.
Consideremos equações da forma
onde
a, b
e
c
são números inteiros, sendo
inteiras, isto é, pares de números
1.2
Anel dos Inteiros Gaussianos
8
Proposição 1.1 Sejam a, b e c inteiros e d = mdc(a, b). A equação diofantina
ax + by = c tem soluções se, e somente se, d | c.
Dem.: Consideremos o conjunto I de todos os valores que o primeiro membro
pode assumir, isto é, I = {ax + by|x, y ∈ Z}. Não é complicado ver que I é um ideal
de Z e que se d = mdc(a, b), temos I = dZ. Obviamente, a equação tem solução se,
e somente se, c ∈ I , e isso acontece se, e somente se, d | c.
Veremos agora como encontrar todas as soluções de uma equação diofantina no
caso em que existem soluções.
Teorema 1.5 Sejam a, b e c inteiros tais que d = mdc(a, b) divide c. Escrevendo d
na forma d = ra + sb, com r, s ∈ Z, temos que x0 = r dc , y0 = s dc é uma solução da
equação ax + by = c. Toda outra solução é da forma x = x0 + db t, y = y0 − ad t, com
t ∈ Z. E, reciprocamente, para todo t ∈ Z, os valores x e y dados pelas fórmulas
acima são soluções da equação.
Dem.: Se d = ra+sb, multiplicando ambos os membros por dc , temos que (r dc )a+
c
(s d )b = d dc = c. Logo, x0 = r dc , y0 = s dc é uma solução. Devemos provar agora que
todo par de inteiros da forma dada no enunciado é solução e, reciprocamente, que
toda solução é dessa forma. De fato, dados x = x0 + db t, y = y0 − ad t, substituindo
na equação, temos:
a
ab
ab
b
a(x0 + t) + b(y0 − t) = ax0 + t + by0 − t = ax0 + by0 = c
d
d
d
d
.
Seja agora (x0 , y 0 ) uma solução. Mostraremos que existe t ∈ Z tal que x0 =
x0 + db t, y 0 = y0 − ad t. Como (x0 , y 0 ) é solução, temos que ax0 + by 0 = c = ax0 + by0 ,
donde a(x0 −x0 ) = b(y0 −y 0 ). Escrevendo a = a1 d e b = b1 d, temos que mdc(a1 , b1 ) =
mdc( ad , db ) = 1. Dividindo a expressão acima por d, vem que
a1 (x0 − x0 ) = b1 (y0 − y 0 )(∗)
Em particular, b1 | a1 (x0 − x0 ). Como mdc(a1 , b1 ) = 1, do Teorema de Euclides,
temos que b1 | (x0 − x0 ) e existe t ∈ Z tal que x0 − x0 = b1 t, isto é, x1 = x0 + db t.
Ainda, substituindo x0 − x0 por b1 t na relação (*), temos a1 b1 t = b1 (y0 − y 0 ), donde
y 0 = y0 − a1 t = y0 − ad t.
1.2
Anéis Quocientes de Inteiros Gaussianos
Nesta seção, apresentamos alguns resultados que serão utilizados na representação de grafos Gaussianos.
1.2
Anel dos Inteiros Gaussianos
9
Por simplicidade de notação, dado
α ∈ Z[i],
denotaremos o quociente
Z[i]
por
(α)
Z[i]α .
Teorema 1.6 Seja 0 6= α = a + bi ∈ Z[i]. Então Z[i]α possui N (α) = a2 + b2
elementos.
Dem.: Seja
α 6= 0 um inteiro Gaussiano e N = N (α). Armamos que Z[i]N
possui N elementos. De fato, se β = b1 + b2 i e β 0 = b01 + b02 i são congruentes módulo
N , então existem β 00 = b001 + b002 i tal que β − β 0 = β 00 N , o que acarreta b1 − b01 = b001 N
e b2 − b02 = b002 N . Assim, b1 ≡ b01 (mod N ) e b2 ≡ b02 (mod N ). Portanto, existem N 2
possibilidades para os coecientes de β .
Como N (α) = αα, então (N (α)) = (αα) ⊆ (α). Esta última inclusão é válida, pois, para todo β ∈ Z[i], βαα é múltiplo de α. Assim, pelo Exemplo 1.4, temos:
Z[i]
(αα) ∼ Z[i]
e | Z[i] | = nm, onde n = | (α) | e m = | Z[i] |. Finalmente, a seguinte trans(α) =
2
(αα)
(α)
(αα)
(αα)
(α)
(α)
formação f : Z[i]
→ (αα)
denida por f (β + (α)) = βα + (αα) é um isomorsmo e
(α)
Z[i]
Z[i]
os quocientes (α) e (α) têm o mesmo número de elementos.
Teorema 1.7 Seja α = a + bi ∈ Z[i] e N = a2 + b2 a norma de α. Então ZN e
Z[i]α são anéis isomorfos se, e somente se, mdc(a, b) = 1.
Dem.: Se ZN e Z[i]α são anéis isomorfos, denotaremos por f : Z[i]α → ZN
o isomorsmo. Suponha que mdc(a, b) = d 6= 1. Então d | a e d | b, ou seja,
é um inteiro. Além disso, 1 < d implica 0 < N (α)
< N.
d | a2 + b2 = N (α) e N (α)
d
d
N (α)
N (α)
N (α)
N (α)
Com isso, f ( d ) = d f (1) = d 6= 0 (mod N ). Por outro lado, d ≡ α αd ≡
0 (mod α), de onde obtemos que f (0) 6= 0, uma contradição com o fato de f ser um
isomorsmo de anéis.
Suponha agora que mdc(a, b) = 1 e considere a função µ : ZN → Z[i]α dada
por µ(g) = g (mod α). Para provar que µ está bem denida, tome g, g 0 ∈ ZN tais
que g ≡ g 0 (mod N ). Então existe z ∈ Z tal que g − g 0 = zN = zαα. Portanto,
g ≡ g 0 (mod α).
µ é injetora, pois se µ(g) ≡ 0 (mod α), então g ≡ 0 (mod N ). Seja µ(g) = g = βα,
com β = x + yi ∈ Z[i]. Então de g = (x + yi)(a + bi) = (xa − yb) + (xb + ya)i
obtemos: xa − yb = g, xb + ya = 0. Assim, (x, y) = (−at, −bt), t ∈ Z. Portanto,
g = −ata − btb = (−t)(a2 + b2 ) = (−t)N . Logo, g ≡ 0 (mod N ).
µ é sobrejetora. De fato, considere γ = x + yi e um par de inteiros x0 , yo tais
que x0 b + y0 a = −y . Isso é válido pois, como supomos mdc(a, b) = 1, existem dois
números x0 e y 0 tais que ax0 + by 0 = 1. Multiplicando ambos os lados da última igualdade por (−y), obtemos ax0 + by0 = −y , onde x0 = x0 (−y) e y0 = y 0 (−y). Então
(x + yi) + (x0 + y0 i)(a + bi) = (x + x0 a − y0 b) + (y + y0 a + x0 b)i = x + x0 a − y0 b. Este
é um inteiro congruente a γ módulo α. Portanto, µ(x + x0 a − y0 b) = x + x0 a − y0 b ≡
γ (mod α).
1.2
Anel dos Inteiros Gaussianos
10
Corolário 1.1 Seja 0 6= α ∈ Z[i]. Então:
(α)
i) Se β ∈ Z[i] divide α, então o ideal (β) ⊆ Z[i]α possui N
elementos.
N (β)
ii) Tomando β ∈ Z[i] tal que β não divide α e γ = mdc(α, β), então o ideal
(α)
(β) ⊆ Z[i]α é gerado por γ e possui N
elementos.
N (γ)
Dem.:
i) Como β divide α, então (α) ⊆ (β). Assim,
Z[i]
(α)
(β)
(α)
∼
=
Z[i]
(β)
. Logo,
β
α
possui
N (α)
N (β)
β
α
é um ideal de
Z[i]
(α)
e temos:
elementos.
ii) Considere γ = mdc(α, β). Como Z[i]α é um domínio euclidiano, então, pelo
Teorema 1.4, existem γ1 , γ2 ∈ Z[i] tais que γ = γ1 β + γ2 α. Assim, γ ≡ γ1 β (mod α),
o que implica a inclusão (γ) ⊆ (β). Por outro lado, γ divide β . Com isso, (β) ⊆ (γ).
Logo, (β) é gerado por γ = mdc(α, β). Como (γ) ⊆ Z[i]α , pelo item i, (β) = (γ)
possui NN (α)
elementos.
(γ)
Lema 1.1 Seja 0 6= a + bi ∈ Z[i]. Então x + yi ≡ x0 + y0 i (mod a + bi) se, e somente
se, existem u, v ∈ Z tais que x0 = x + ua − vb e y 0 = y + ub + va.
Dem.: De fato:
x − x0 + yi − y 0 i = (u + vi)(a + bi), u, v ∈ Z ⇔
x − x0 + (y − y 0 )i = ua + ubi + avi − vb, u, v ∈ Z ⇔
x − x0 + (y − y 0 )i = ua − vb + (ub + va)i − vb, u, v ∈ Z
A primeira signica que x + yi ≡ x0 + y 0 i (mod a + bi) e a última assegura que
x0 = x + ua − vb e y 0 = y + ub + va.
Teorema 1.8 Sejam a, b ∈ Z tais que 0 < a ≤ b e dois conjuntos denidos como:
i) Sa = {x + yi ∈ Z[i] | 0 ≤ x ≤ a − 1 e 0 ≤ y ≤ a − 1}
ii) Sb = {x + yi ∈ Z[i] | a ≤ x ≤ a + b − 1 e 0 ≤ y ≤ b − 1}.
Então D = Sa ∪ Sb é um sistema residual reduzido de Z[i]α .
Dem.: Sabemos que um sistema residual reduzido de Z[i]α , com 0 6= α = a + bi,
possui a2 + b2 elementos. Como |D| = |Sa ∪ Sb | = |Sa | + |Sb | − |Sa ∩ Sb | = a2 + b2 − 0,
basta provar que os elementos de D são diferentes módulo α. Dados η = x + yi, η 0 =
x0 + y 0 i ∈ D, tais que η ≡ η 0 (mod α), devemos mostrar que η = η 0 . Pelo Lema 1.1,
temos: x + yi ≡ x0 + y 0 i (mod α) se, e somente se, x − x0 = ua − vb e y − y 0 = ub + va,
onde u, v ∈ Z.
Há três possibilidades para o produto uv : uv > 0, uv < 0 ou uv = 0.
No primeiro caso (uv > 0), como a ≥ 0 e b ≥ 0, com a, b ∈ Z, então temos: |y − y 0 | = |ub + va| = |v|a + |u|b ≥ a + b. Mas y, y 0 ∈ {0, . . . , b − 1}, então
|y − y 0 | ≤ b − 1 < a + b, o que é uma contradição. Logo, uv > 0 não ocorre.
1.2
Anel dos Inteiros Gaussianos
11
Para o caso uv < 0, temos |x − x0 | = |ua − vb| = |u|a + |v|b ≥ a + b > a + b − 1.
Como x, x0 ∈ {0, . . . , a + b − 1}, então |x − x0 | ≤ a + b − 1, o que também é uma
contradição. Dessa forma, uv < 0 não ocorre.
Podemos considerar então uv = 0. Suponha que u = 0, então x − x0 = −vb e
y−y 0 = va. Como |x−x0 | < a+b, a primeira condição nos dá |−vb| = |x−x0 | < a+b.
Assim, |v|b < a+b e, consequentemente, |v| < ab +1 ≤ 2, o que nos dá |v| < 1. Logo,
para u = 0 há três casos para v . Se v = 1, então temos: x − x0 = −b e y − y 0 = a,
ou ainda, x = x0 − b e y = y 0 + a. Por outro lado, já sabemos que 0 ≤ x0 ≤ a + b − 1,
então somando −b nas desigualdades obtemos x ≤ a − 1, o que obriga η ∈ Sa . Mas,
da igualdade y = y 0 + a, tiramos que η ∈ Sb , pois b − 1 ≥ y = y 0 + a ≥ a > a − 1, o
que impede η ∈ Sa . Agora, de Sa ∩ Sb = ∅, obtemos uma outra contradição. O caso
v = −1 pode ser analisado de forma análoga. Finalmente, supomos v = 0, então
temos |ub + va| = |u|b. Como |y − y 0 | < b, esta condição força u = 0. Portanto, a
única possibilidade é que x = x0 e y = y 0 .
Capítulo 2
Grafos Circulantes e Gaussianos
2.1
Fatos básicos sobre Grafos
As redes interligadas nas quais faremos o roteamento serão modeladas por meio
de grafos circulantes e grafos gaussianos, objetos de estudo neste capítulo. Segundo
Bermond (1995), entre outras aplicações, grafos circulantes podem ser usados em
redes de telecomunicações, no desenvolvimento de circuitos VLSI, e organização de
serviços de memória de vários módulos. Em relação aos grafos Gaussianos, veremos
que são isomorfos aos circulantes sob algumas restrições e que o roteamento neles é
feito com um menor custo computacional. Antes de estudar essas classes de grafos,
serão apresentados alguns conceitos básicos sobre grafos com exemplos ilustrativos.
Como referência, podemos citar Netto (2006).
Denição 2.1 Um grafo G = (V, E) consiste em um conjunto nito não-vazio
V (G) = V de pontos chamados vértices junto com um conjunto E(G) = E de
pares ordenados de pontos distintos de V , chamados de arestas. Um subgrafo de G
é um grafo G0 = (V 0 , E 0 ) com um conjunto de vértices V 0 (G0 ) = V 0 e um conjunto
de arestas E 0 (G0 ) = E 0 tais que V 0 ⊂ V e E 0 ⊂ E .
Exemplo 2.1 Neste exemplo, apresentamos um grafo G = (V, E), onde os vértices
são V = {1, 2, 3, 5, 6, 7, 8} e E = {(1, 2), (2, 3), (3, 5), (5, 6), (6, 7), (2, 7), (7, 8), (8, 1)}.
12
2.1
Grafos Circulantes e Gaussianos
13
Figura 2.1: Exemplo de grafo com 7 vértices
Note que grafos podem ser utilizados para modelar redes da seguinte forma. Para
cada elemento da rede, associamos a um vértice de um grafo e para cada ligação,
existe uma aresta correspondente deste mesmo grafo.
Figura 2.2: Modelagem de redes através de grafos
Denição 2.2 Dado um grafo G = (V, E), se existir e = (u, v) ∈ E , dizemos que
u e v são vértices adjacentes. Mais ainda, o vértice u e a aresta e são incidentes
um com outro, assim como v e e. O grafo G é não-direcionado se para cada par de
vértices (u, v) ∈ E implicar que (v, u) ∈ E . Se o número cardinal de V é n, dizemos
que G tem ordem n.
Para um grafo
incidentes com
de grau
d.
v.
G,
dizemos que o
grau de um vértice v
é o número de arestas
d, G é chamado regular
G é rotulado se os seus n vértices são distinguidos
Se todos os vértices têm o mesmo grau
Dizemos que um grafo
uns dos outros por rótulos.
Exemplo 2.2 Neste exemplo, temos um grafo no qual cada um dos vértices está
ligados a outros 3 vértices. Portanto, todos têm grau 3 e podemos dizer que o grafo
é de grau 3.
2.1
Grafos Circulantes e Gaussianos
14
Figura 2.3: Exemplo de grafo de grau 3
Denição 2.3 A matriz de adjacências A = [aij ], de um grafo rotulado G com n
vértices é a matriz n × n na qual aij = 1 se vi é adjacente a vj e aij = 0 caso
contrário.
Assim, há uma correspondência um a um entre grafos rotulados de ordem
n e as
matrizes binárias simétricas com diagonal nula, ou seja, aquelas matrizes de ordem
n × n, onde as entradas são
aii = 0, ∀i = {0, 1, . . . , n}.
todas iguais a 1 ou 0, valem a igualdade
aij = aji
e
Denição 2.4 Dois grafos G = (V, E) e H = (V 0 , E 0 ) são isomorfos se existir uma
bijeção entre os conjuntos de vértices: φ : V → V 0 que preserva adjacências, ou
seja, se dois vértices v1 , v2 ∈ V são adjacentes em G, então φ(v1 ) e φ(v2 ) devem ser
adjacentes em H . Denotamos que os grafos G e H são isomorfos por G ∼
= H.
Observação 2.1 Um isomorsmo φ de um grafo G nele mesmo é chamado automorsmo.
Exemplo 2.3 Os dois grafos deste exemplo são isomorfos se considerarmos a função
φ : {1, 2, 3, 4} → {a, b, c, d} tal que φ(1) = a; φ(2) = b; φ(3) = c; φ(1) = d.
2.1
Grafos Circulantes e Gaussianos
15
Figura 2.4: Exemplo de dois grafos isomorfos
Denição 2.5 Uma cadeia de um grafo G é uma sequência alternada de vértices
e arestas v0 , e1 , v1 , . . . , vn−1 , en , vn na qual cada aresta é incidente com dois vértices
que imediatamente a procede e a segue. Esta cadeia liga v0 e vn e também pode ser
indicada apenas pelos vértices como v0 v1 . . . vn . A cadeia é chamada de caminho se
todos os vértices são diferentes e de ciclo se v0 = vn . Observe que uma cadeia pode
ser vista como um subgrafo de G.
Um grafo
G
é conexo se qualquer par de vértices é ligado por um caminho.
Podemos denir o comprimento de um caminho
arestas que ocorre nele e a distância
D(u, v)
v0 v1 . . . vn
como
entre dois vértices
u
e
n, o número de
v em G como o
comprimento de um caminho mais curto que os ligam.
Exemplo 2.4 Na ilustração a seguir, temos um grafo conexo. Se considerarmos
nele o caminho 1 2 3 4, que liga os vértices 1 e 4, seu comprimento é 3. Mas esse
não é o menor caminho ligando esses vértices, pois podemos considerar também o
caminho 1 0 4, cujo comprimento é 2. Assim, temos D(1, 4) = 2. Note ainda que
neste mesmo grafo temos o exemplo de um ciclo, que é o caminho 0 1 2 3 4 0
Figura 2.5: Grafo conexo
2.1
Grafos Circulantes e Gaussianos
16
Observação 2.2 Em um grafo conexo G = (V, E) a distância é uma métrica, isto
é, ocorre para quaisquer vértices u, v, w ∈ V :
i) D(u, v) ≥ 0, com D(u, v) = 0 se, e somente se, u = v .
ii) D(u, v) = D(v, u).
iii) D(u, v) + D(v, w) ≥ D(u, w).
Dem.: As duas primeiras são de fácil vericação. Demonstra-se a terceira
supondo que existam vértices u0 , v0 e w0 tais que D(u0 , v0 ) + D(v0 , w0 ) < D(u0 , w0 ).
Assim, existiriam um menor caminho u0 a1 a2 . . . v0 de tamanho n ligando u0 a v0
e um menor caminho v0 b1 b2 . . . w0 de tamanho m ligando v0 a w0 . Mas o caminho
u0 a1 a2 . . . v0 b1 b2 w0 tem tamanho m + n e liga u0 a w0 , o que contradiz a hipótese de
que o menor caminho ligando u0 a w0 tem tamanho D(u0 , w0 ) maior que D(u0 , v0 )+
D(v0 , w0 ) = m + n.
Denição 2.6 O diâmetro k de um grafo conexo G é o tamanho do maior entre
todos os menores caminhos de cada par de vértices possíveis do grafo.
É fácil vericar que, no Exemplo 2.1, o diâmetro do grafo é 4. No Exemplo 2.2,
o diâmetro é 3. No grafos do Exemplo 2.3, o diâmetro é 1 e no 2.4, temos um grafo
cujo diâmetro é 4.
Denição 2.7 Dois vértices u e v são similares se para algum automorsmo α de
G, ocorrer α(u) = v . Da mesma forma, duas arestas (u1 , v1 ), (u2 , v2 ) são similares
se existir um automorsmo α de G tal que α(u1 , v1 ) = (u2 , v2 ).
Denição 2.8 Um grafo é vértice-simétrico se qualquer par de vértices é similar e
é aresta-simétrico se qualquer par de arestas é similar. Ele será simétrico se for ao
mesmo tempo vértice-simétrico e aresta-simétrico.
Observação 2.3 A distância média k de um grafo vértice-simétrico pode ser cal-
culada como
P
k :=
D(u,u0 )
u6=u0
u∈V
]V − 1
,
onde u0 é um vértice qualquer xado e ]V é o número de elemento de V , ou seja, a
ordem do grafo. De fato, considerando u0 e v0 então devemos ter a igualdade
P
D(u,u0 )
u6=u0
u∈V
]V − 1
P
=
D(v,v0 )
v6=v0
v∈V
]V − 1
2.2
Grafos Circulantes e Gaussianos
17
pois, como o grafo é simétrico, existe um automorsmo α tal que α(v0 ) = u0 , o que
implica
P
P
P
D(u,u0 )
u6=u0
u∈V
.
2.2
D(α(v),α(v0 ))
= v6=v0
D(v,v0 )
= v6=v0
v∈V
v∈V
Grafos Circulantes
Apresentamos nesta seção uma classe de grafos que será objeto de estudos neste
trabalho, os grafos circulantes. Trata-se de uma classe especíca de uma classe mais
geral, os grafos de Cayley, que são denidos a seguir.
Denição 2.9 Dado um grupo G nito e S ⊂ G , o grafo de Cayley Cay(G, S) é o
grafo com conjunto de vértices V = G e o conjunto de arestas E = {(x, y)|x, y ∈
G, ∃s ∈ S; y = xs}.
Pela denição, podemos mostrar que se
onde 1 é o elemento neutro do grupo
s ∈ S,
então
(1, s) ∈ E
e
(s−1 , 1) ∈ E ,
G.
Denição 2.10 Um grafo circulante com N vértices e saltos {j1 , j2 , . . . , jm } é um
grafo não-direcionado no qual cada vértice n, 0 ≤ n ≤ N − 1, é adjacente a todos os vértices n ± ji (mod N ), com 1 ≤ i ≤ m. Denotamos este grafo como
CN (j1 , j2 , . . . , jm ).
Note que grafos circulantes são grafos de Cayley sobre grupos cíclicos. De fa-
CN (j1 , . . . , jk ). Considere G um grupo cíclico G =
{aj1 , . . . , ajk } ⊂ G . Provemos que ocorre o isomorsmo de grafos Cay(G, S) ∼
= CN (j1 , . . . , jk ). Sabemos da denição que o conjunto
E das arestas de Cay(G, S) é:
{(a0 , aj1 ), . . . , ((a0 , ajk ), (a1 , aj1 +1 ), . . . , (a1 , ajk +1 ), . . . , (aN −1 , aj1 +N −1 ), . . . ,
(aN −1 , ajk +N −1 )}.
0
Por outro lado, o conjunto E das arestas do grafo circulante CN (j1 , . . . , jk ) é
to, tome o grafo circulante
{a0 , a1 , a2 , . . . , aN −1 } e S =
dado por:
{(0, j1 ). . . . , (0, jk ), (1, j1 + 1), . . . , (1, jk + 1), . . . , (N − 1, j1 + N − 1), . . . , (N −
1, jk + N − 1)}.
j
Agora basta tomar a seguinte correspondência entre os vértices: a → j (mod N )
0
q
jm +q
e a correspondência entre as arestas f : E → E , dada por f (a , a
) = (q, jm +
q), q = 0, . . . , N − 1.
Proposição 2.1 O grafo de Cayley Cay(G, S) é conexo se, e somente se, S gera G .
Dem.: Suponha Cay(G, S) conexo. Considere g ∈ G e s ∈ S 6= ∅. Então existe
um caminho que liga g a s, digamos gh1 . . . hn s. Sendo g e h1 adjacentes, existe
s1 ∈ S tal que h1 = gs1 , ou seja, g = h1 s−1
1 . Da mesma forma, sendo h1 e h2
2.2
Grafos Circulantes e Gaussianos
18
adjacentes, existe s2 ∈ S tal que h2 = h1 s2 , o que nos dá h1 = h2 s−1
2 . Seguindo o
mesmo raciocínio para o restante do caminho, então existe sn ∈ S tal que h = hn sn ,
−1
−1 −1
−1 −1 −1
ou seja, hn = ss−1
n . Assim, temos: g = h1 s1 = (h2 s2 )s1 = ((h3 s3 )s2 )s1 =
−1
−1
−1
ss−1
n . . . s3 s2 s1 , isto é, qualquer elemento g tomado em G é gerado por elementos
de S ou inversos de elementos desse mesmo conjunto.
Suponha agora que G = hSi. Tome dois elementos g, h de G . Assim, g =
−1
s1 s2 . . . sn e h = t1 t2 . . . tm , onde si ∈ G ou s−1
1 ∈ S e tj ∈ S ou tj ∈ S para todo
i ∈ {1, . . . , n} e j ∈ {1, . . . , m}. Por outro lado, em um grafo de Cayley Cay(G, S),
se x, y são tais que x = ys, onde s ∈ S ou s−1 ∈ S , então (x, y) ∈ E ou (y, x) ∈ E ,
isto é, x e y estão ligados (E é o conjunto das adjacências). Com isso, g está ligado a s1 s2 . . . sn−1 , pois g = s1 s2 . . . sn e sn ∈ S ou s−1
n ∈ S . É fato também que
s1 s2 . . . sn−1 está ligado a s1 s2 . . . sn−2 pois sn−1 ∈ S ou s−1
n−1 ∈ S . Continuando com
o mesmo raciocínio, é possível ligar g a s1 , e de forma análoga, também é possível
−1
ligar h a t1 . Como s1 ∈ S ou s−1
1 ∈ S e t1 ∈ S ou t1 ∈ S , então s1 e t1 estão
−1
ligados a 1. De fato, dado s ∈ S ou s , então s = 1s e (1, s) ∈ E no primeiro
caso (s ∈ S ) e 1 = ss−1 e (s, 1) ∈ E no segundo (s−1 ∈ S ). Portanto, g está ligado
a s1 , que está ligado a 1 e 1 está ligado a t1 , que por sua vez está ligado a h. Logo,
g e h estão ligados.
2.2.1
Algoritmo de Euclides Estendido
Nesta subseção, apresentamos um algoritmo que auxiliará no roteamento de
grafos circulantes. Trata-se de uma adaptação do conhecido Algoritmo de Euclides,
que é utilizado para encontrar o máximo divisor comum entre dois números inteiros
diferentes de zero.
d =
mdc(a, b). Sejam q ≡ a (mod d) e r o inteiro tal que a = rb+q , ou seja, q = a−rb. O
Algoritmo de Euclides é baseado na aplicação repetida da fórmula d = mdc(a, b) =
mdc(b, q). Suponha que a chamada recursiva com argumentos b e q também retorna
inteiros k e l tais que d = kb + lq . Lembrando da denição de r , temos d = kb + lq =
kb + l(a − rb) = la + (k − lr)b. Assim, temos: d = ia + jb, para i = l e j = k − lr.
Esta última equação sugere um método de determinar os inteiros i e j . Este
Sejam
a
e
b
inteiros positivos, e denote com
d
seu maior divisor comum:
método, conhecido como Algoritmo Estendido de Euclides, é mostrado a seguir.
Algoritmo ExtendedEuclidGCD(a,b):
Entrada: inteiros não-negativos
Saída: Tripla de inteiros
(d, i, j)
a
e
b.
tais que
b = 0, então
(a, 1, 0);
q ← a (mod b)
Seja r o inteiro tal que a = rb + q
(d, k, l) ← ExtendedEuclidGCD(b, q)
Se
retorna
d = mdc(a, b) = ia + jb.
2.3
Grafos Circulantes e Gaussianos
retorna
19
(d, l, k − lr)
O código-fonte do Algoritmo de Euclides Estendido é apresentado no Anexo
deste trabalho como função auxiliar, na seção que trata do roteamento de grafos
circulantes.
Proposição 2.2 Um grafo circulante CN (j1 , j2 , . . . , jm ) é conexo se, e somente se,
ocorrer a igualdade mdc(j1 , j2 , . . . , jm , N ) = 1.
Dem.: Considere CN (j1 , j2 , . . . , jm ) igual ao grafo de Cayley Cay(G, S), sendo
G o grupo cíclico {1, a, . . . , aN −1 } e S = {aji , . . . , ajm }. Já foi provado na Proposição
2.1 que Cay(G, S) é conexo se, e somente se, S gera G . Isso é o mesmo que dizer que
para a ∈ G , existem k1 , k2 , . . . , km ∈ Z tais que a = ak1 j1 ak2 j2 . . . akm jm , ou seja, 1 ≡
(k1 j1 +k2 j2 +. . .+km jm ) (mod N ), equivalente a: 1 = (k1 j1 +k2 j2 +. . .+km jm )+kN ,
onde k1 , k2 , . . . km , K ∈ Z. Portanto, mdc(j1 , j2 , . . . , jm , N ) = 1.
Lema 2.1 Seja G = Cay(G, S) um grafo de Cayley. Então G é circulante se, e
somente se, G é cíclico.
Dem.: A volta é uma consequência direta da denição de grafos circulantes.
Suponha que o grafo Cay(G, S) é circulante. Assim, o grau do grafo d é o cardinal
de S e a ordem N é o cardinal de G . Então Cay(G, S) ∼
= CN (j1 , . . . jd ) para alguns
inteiros diferentes j1 , . . . , jd . Denotemos por f : G → ZN o isomorsmo de grafos
entre Cay(G, S) e CN (j1 , . . . jd ). Pela denição de isomorsmo de grafo, temos:
y = x + si se, e somente se, f (y) = f (x) + jk , onde i = 1, . . . , d. Podemos assumir
sem perda de generalidade que f (si ) = f (ji ) para i = 1, . . . , d. Note que, como consequência f (msi ) = f (m)f (si ) = f (m)ji . Além disso, f (0G ) = 0ZN . Sejam
x, y ∈ G
P
dois vértices. Como Cay(G, S) é conexo, existem xi , yi ∈ Z tais que x = di=1 xi si e
P
P
P
P
y = di=1 yi si . Agora, f (x + y) = f ( di=1 xi si + di=1 yi si ) = f ( di=1 (xi + yi )si ) =
Pd
Pd
i−1 f (xi + yi )f (si ) =
i−1 (f (xi ) + f (yi ))f (si ) = f (x) + f (y), o que implica que f
é um isomorsmo de grupos. Portanto, G é cíclico.
2.3
Grafos Gaussianos
Denição 2.11 Seja 0 6= α ∈ Z[i]. Denimos o grafo gaussiano gerado por α,
Gα = (V, E), como segue:
i) V = Z[i]α é o conjunto de vértices.
ii) E = {(η, β) ∈ V × V |β − η ≡ ±1, ±i (mod α)} é o conjunto de arestas.
2.3
Grafos Circulantes e Gaussianos
20
Pela denição, grafos gaussianos têm ordem
quando
N (α) = 1,
N (α), são regulares de grau 4, exceto
são não-direcionados, conexos e vértices-simétricos. De fato, são
regulares, pois se possuírem mais de quatro elementos, então cada vértice é conec-
(η, β) ∈ V × V ,
(η − β) = −(β − η) ≡ ±1, ±i (mod α),
tado a quatro outros vértices. Eles são não-direcionados, pois se
β − η ≡ ±1, ±i (mod α). Assim, temos
ou seja, (β, η) ∈ V × V . Segue ainda da denição que grafos gaussianos sempre
possuem o 0 ∈ Z[i]. Dessa forma, dado qualquer elemento α = a + bi, vértice do
grafo, então ele está conectado a a − 1 + bi, que está conectado a a − 2 + bi, que por
sua vez está ligado por um caminho a a − a + bi. Este último está ligado a (b − 1)i
que, pelo mesmo raciocínio, está ligado a 0i = 0. Como todos estão ligados ao 0, é
possível tomar um caminho ligando quaisquer dois vértices passando pelo próprio 0.
então
Denição 2.12 Um Grafo Toroidal com b2 vértices pode ser denido como Tb =
(V, E), onde V = Zb × Zb e dois vértices (n, m), (n0 , m0 ) ∈ V são adjacentes se, e
somente se, n = n0 e m − m0 ≡ ±1 (mod b) ou m = m0 e n − n0 ≡ ±1 (mod b).
Mais adiante, veremos que os grafos circulantes, da seção anterior, e toroidais
classicam os grafos gaussianos.
O Lema seguinte nos gera condições necessárias e sucientes para dois grafos
gaussianos serem isomorfos.
Lema 2.2 Dados a + bi, c + di ∈ Z[i], então Ga+bi ∼
= Gc+di se, e somente se, existe
u ∈ {±1, ±i} tal que a + bi = u(c + di) ou (a − bi) = u(c + di), isto é, c + di é
associado a a + bi ou a − bi.
Conforme o Lema 2.2, podemos assumir que qualquer grafo gaussiano é gerado
0 6= α = a + bi ∈ Z[i] tal que 0 ≤ a ≤ b. De fato, se Ga+bi
a > b, então existe um outro grafo gaussiano gerado por c + di, com c ≤ d,
isomorfo a Ga+bi . Da mesma forma, se Ga+bi for qual que a < 0 ou b < 0, então
existe um grafo Gc+di isomorfo a Ga+bi , onde 0 < c.
por um inteiro gaussiano
é tal que
Sejam a, b ∈ Z tais que 0 < a ≤ b e D = Sa ∪ Sb , onde Sa = {x + yi ∈ Z[i] | 0 ≤
x ≤ a − 1 ∧ 0 ≤ y ≤ a − 1} e Sb = {x + yi ∈ Z[i] | a ≤ x ≤ a + b − 1 ∧ 0 ≤ y ≤ b − 1}
2
2
(já denidos no Teorema 1.8). Sabemos que o número de elementos de D é a + b .
É possível construir um grafo G = (D, E) da seguinte forma:
2
2
2
2
1) Arranje os a + b vértices em dois quadrados justapostos de tamanhos a e b
de forma que estejam alinhados na parte inferior e o quadrado menor que do lado
esquerdo. O vértice localizado no canto inferior esquerdo será o
x + yi
se estiverem
x
posições à direita do nível do
0
e
y
0
e os demais serão
acima do
0.
2) Ligue cada vértice aos que, se existirem, estão localizados imediatamente acima, abaixo, à direita e à esquerda.
3) Para os vértices
4) Para os vértices
5) Para os vértices
0 ≤ x ≤ b − 1, ligue x + 0i a (x + a) + (b − 1)i.
b ≤ x ≤ a + b − 1, ligue x + 0i a (x − b) + (a − 1)i
0 ≤ y ≤ a − 1, ligue 0 + yi a (a + b − 1) + (y + b − a)i
2.3
Grafos Circulantes e Gaussianos
6) Para os vértices
a ≤ y ≤ b − 1,
ligue
21
x + yi
a
(a + b − 1) + (y − a)i.
2.5.
Considerando, por exemplo, a=5 e b=9, temos o grafo da gura
Figura 2.6: Grafo
Para
Ga+bi ,
com
0 < a ≤ b,
G = (D, E)
já vimos que possui
gulares de grau 4. O próximo teorema diz que
Gα
a2 + b 2
vértices e que são re-
é isomorfo a
G,
anteriormente
construído.
Teorema 2.1 Se 0 < a ≤ b e α = a+bi, então Gα ∼
= G, onde G é o grafo construído
acima.
Dem.: Suponha
Gα = (Z[i]α , E 0 ) e G = (D, E). Pelo Teorema 1.8, temos
Z[i]α = {A + (α)|A ∈ D}. Considere a função: ϕ : D → Z[i]α denida como
ϕ(A) = A + (α).
Obviamente, ϕ está bem denida. Além disso, ela é bijetora. Primeiramente
mostraremos que é injetora. Suponha que A + (α) = B + (α), então A − B ≡
0 (mod α). Daí, segue que A = B . A função ϕ também é sobrejetora, pois se
A + (α) ∈ Z[i]α , então A ∈ D e, assim, ϕ(A) = A + (α).
Para provar que ϕ é um isomorsmo de grafos, resta mostrar que ela preserva adjacências, ou seja, se (A, B) ∈ E , então (ϕ(A), ϕ(B)) ∈ E 0 . Suponha que
A = x + yi e B = x0 + y 0 i.
1o caso: 0 < x < a − 1 e 0 < y < a − 1 ou a < x < a + b − 1 e 0 < y < b − 1
Neste caso, B é ligado a A pelo passo 1. Logo, x0 = x − 1 e y 0 = y (quando
B está imediatamente à esquerda de A) ou x0 = x + 1 e y 0 = y (quando B está
imediatamente à direita de A) ou x0 = x e y 0 = y + 1 (quando B está imediatamente
acima de A) ou ainda x0 = x e y 0 = y − 1 (quando B está imediatamente abaixo
de A). Em todas essas situações, A − B ≡ u (mod α), com u ∈ U (Z[i]). Logo, pela
denição de grafo gaussiano, temos (A + (α), B + (α)) ∈ E 0 .
2.3
Grafos Circulantes e Gaussianos
22
2o caso: 0 < x ≤ b − 1 e y = 0
Neste caso, B pode ter sido ligado a A pelo passo 1 ou pelo passo 2. Se for
pelo passo 1, então x0 = x − 1 e y 0 = y (quando B está imediatamente à esquerda
de A) ou x0 = x + 1 e y 0 = y (quando B está imediatamente à direita de A) ou
x0 = x e y 0 = y + 1 (quando B está imediatamente acima de A). Analogamente ao primeiro caso, a conclusão é que (A + (α), B + (α)) ∈ E 0 . Por outro lado,
se a ligação tiver sido feita pelo passo 2, então x0 = x + a e y 0 = b − 1, ou seja,
B = (x+a)+(b−1)i = x−i+α. Portanto, A−B ≡ −i (mod α) e, consequentemente,
(A + (α), B + (α)) ∈ E 0 .
3o caso: b ≤ x ≤ a + b − 1 e y = 0
Também neste caso, B pode ter sido ligado a A de duas formas. Se for pelo passo 1, então x0 = x − 1 e y 0 = y (quando B está imediatamente à esquerda
de A) ou x0 = x + 1 e y 0 = y (quando B está imediatamente à direita de A) ou
x0 = x e y 0 = y + 1 (quando B está imediatamente acima de A). Analogamente ao primeiro caso, a conclusão é que (A + (α), B + (α)) ∈ E 0 . Por outro lado,
se a ligação tiver sido feita pelo passo 3, então x0 = x − b e y 0 = a − 1, ou seja,
B = x−u+i(a+bi) = x−i+iα. Portanto, A−B ≡ −i (mod α) e, consequentemente,
(A + (α), B + (α)) ∈ E 0 .
4o caso: 0 < y < a − 1 e x = 0
B pode ter sido ligado a A de duas formas. Se for pelo passo 1, então x0 = x + 1
e y 0 = y (quando B está imediatamente à direita de A) ou x0 = x e y 0 = y + 1
(quando B está imediatamente acima de A) ou ainda x0 = x e y 0 = y − 1 (quando B
está imediatamente abaixo de A). Portanto, (A + (α), B + (α)) ∈ E 0 . Se a ligação
tiver sido feita pelo passo 4, então x0 = a + b − 1 e y 0 = y + b − a, ou seja, B =
a+b−1+i(y+b−a) = a+b−1+yi+bi−ai = yi−1+(a+bi)−i(a+bi) = yi−1+(1−i)α.
Como A = yi, então A − B ≡ 1 (mod α) e, portanto, (A + (α), B + (α)) ∈ E 0 .
5o caso: x = a e a ≤ y < b − 1
B pode ter sido ligado a A de duas formas. Se for pelo passo 1, então x0 = x + 1
e y 0 = y (quando B está imediatamente à direita de A) ou x0 = x e y 0 = y + 1
(quando B está imediatamente acima de A) ou ainda x0 = x e y 0 = y − 1 (quando B está imediatamente abaixo de A). Portanto, (A + (α), B + (α)) ∈ E 0 . Se
a ligação tiver sido feita pelo passo 5, então x0 = a + b − 1 e y 0 = y − a, ou seja,
B = a+b−1+i(y−a) = a+b−1+yi−ai = a+yi−1+(−i)(a+bi) = a+yi−1+(−i)α.
Como A=a+yi, então A − B ≡ −1 (mod α) e, portanto, (A + (α), B + (α)) ∈ E 0 .
6o caso: y = a − 1 e 0 < x < a − 1
B pode ter sido ligado a A de duas formas. Se for pelo passo 1, então x0 = x+1 e
y 0 = y (quando B está imediatamente à direita de A) ou x0 = x − 1 e y 0 = y (quando
2.3
Grafos Circulantes e Gaussianos
23
B está imediatamente à esquerda de A) ou ainda x0 = x e y 0 = y − 1 (quando B está
imediatamente abaixo de A). Portanto, (A + (α), B + (α)) ∈ E 0 . Se a ligação tiver
sido feita pelo passo 3, então x0 = x + b e y 0 = 0, ou seja, B = (x + b) + i(0) = x + b.
Assim, A − B = x + (a − 1)i − (x + b) = ai − b − i = i(a + bi) − i = iα − i, o que
nos diz que A − B ≡ −i (mod α) e, portanto, (A + (α), B + (α)) ∈ E 0 .
7o caso: y = b − 1 e a − 1 < x < a + b − 1
B pode ter sido ligado a A de duas formas. Se for pelo passo 1, então x0 = x+1 e
y = y (quando B está imediatamente à direita de A) ou x0 = x − 1 e y 0 = y (quando
B está imediatamente à esquerda de A) ou ainda x0 = x e y 0 = y − 1 (quando B está
imediatamente abaixo de A. Portanto, (A + (α), B + (α)) ∈ E 0 . Se a ligação tiver
sido feita pelo passo 2, então x0 = x − a e y 0 = 0, ou seja, B = x − a + i(0) = x − a.
Assim, A − B = x + (b − 1)i − (x − a) = a + bi + 1 = α + 1. Dessa forma,
A − B ≡ 1 (mod α) e, portanto, (A + (α), B + (α)) ∈ E 0 .
0
8o caso: x = a + b − 1 e 0 < y < b − a
B pode ter sido ligado a A de duas formas. Se for pelo passo 1, então x0 = x − 1
e y = y (quando B está imediatamente à esquerda de A) ou x0 = x e y 0 = y − 11
(quando B está imediatamente abaixo de A) ou ainda x0 = x e y 0 = y + 1 (quando B está imediatamente acima de A). Portanto, (A + (α), B + (α)) ∈ E 0 . Se
a ligação tiver sido feita pelo passo 5, então x0 = a e y 0 = y + a, ou seja, B =
a − 1 + i(y + a) = a − 1 + yi + ai. Assim, A − B = a + b − 1 + yi − (a + yi + ai) =
a + b − 1 + yi − a + 1 − yi − ai = b − ai − 1 = (−i)(a + bi) − 1 = (−i)α − 1. Dessa
forma, A − B ≡ −1 (mod α) e, portanto, (A + (α), B + (α)) ∈ E 0 .
0
9o caso: x = a + b − 1 e b − a ≤ y < b − 1
B pode ter sido ligado a A de duas formas. Se for pelo passo 1, então x0 = x − 1
e y 0 = y (quando B está imediatamente à esquerda de A) ou x0 = x e y 0 = y − 11
(quando B está imediatamente abaixo de A) ou ainda x0 = x e y 0 = y + 1 (quando
B está imediatamente acima de A). Portanto, (A + (α), B + (α)) ∈ E 0 . Se a ligação
tiver sido feita pelo passo 4, então x0 = 0 e y 0 = y − (b − a), ou seja, B = (y − b + a)i.
Portanto, A − B = a + b − 1 + yi − (y − b + a)i = a + b − 1 + yi − yi + bi − ai =
a + bi + b − ai − 1 = a + bi + (−i)(a + bi) − 1 = (1 − i)(a + bi) − 1 = (1 − i)(α) − 1.
Dessa forma, A − B ≡ −1 (mod α) e, portanto, (A + (α), B + (α)) ∈ E 0 .
10o caso: x = 0 e y = 0
B pode ter sido ligado a A de três formas. Se foi ligado pelo primeiro passo,
então B = 1 ou B = i. Logo, A − B é congruente a 1 ou a i módulo α e, portanto,
(A + (α), B + (α)) ∈ E 0 . Se B foi ligado pelo passo 2, então B = a + (b − 1)i e
assim, A − B = 0 − a − (b − 1)i = −a − bi + i = (−1)(a + bi) + i = (−1)α + i.
Logo, A − B ≡ i (mod α) e, consequentemente, (A + (α), B + (α)) ∈ E 0 . Por último,
se B foi ligado a A pelo passo 4, então B = (a + b − 1) + (b − a)i, o que nos dá
A − B = 0 − (a + b − 1) − (b − a)i = −a − b + 1 + ai − bi = ai − b − a − bi + 1 =
2.3
Grafos Circulantes e Gaussianos
24
i(a + bi) − (a + bi) + 1 = (i − 1)(a + bi) + 1 = (i − 1)α + 1. Logo, A − B ≡ 1 (mod α)
e, assim, (A + (α), B + (α)) ∈ E 0 .
11o caso: x = 0 e y = a − 1
B pode ter sido ligado a A de três formas. Se foi ligado pelo passo 1, então
B = 1 + (a − 1)i ou B = (a − 2)i. Logo, A − B = (a − 1)i − 1 + (a − 1)i = −1 ou
A − B = (a − 1)i − (a − 2)i = i. Logo, A − B ∼
= −1 (mod α) ou A − B ∼
= i (mod α) e,
0
portanto, (A + (α), B + (α)) ∈ E . Se B foi ligado pelo passo 3, então B = b + 0i,
o que nos dá A − B = 0 + (a − 1)i − (b + 0i) = ai − i − b = i(a + bi) − i, ou seja,
A − B ≡ −i (mod α) e, assim, (A + (α), B + (α)) ∈ E 0 . Na última possibilidade, B
pode ter sido ligado pelo passo 4, o que nos diz que B = a + b − 1 + (b − 1)i. Assim,
A−B = (a−1)i−(a+b−1+(b−1)i) = ai−i−a−b+1−(b−1)i = ai−i−a−b+1−
bi+i = ai−b−bi−a+1 = i(a+bi)−(a+bi)+1 = (i−1)(a+bi)+1 = (i−1)(α)+1,
ou seja, A − B ≡ 1 (mod α), o que garante que (A + (α), B + (α)) ∈ E 0 .
12o caso: x = a e y = (a − 1)i
A única possibilidade neste caso para que B se ligue a A é pelo passo 1. Então
B = (a−1)+(a−1)i ou B = (a+1)+(a+1)i ou B = a+ai ou ainda B = a+(a−2)i.
Em todas essas situações, A − B ≡ u (mod α), com u ∈ U (Z[i]). Logo, pela denição
de grafo gaussiano, temos (A + (α), B + (α)) ∈ E 0 .
13o caso: x = a e y = b − 1
B pode ter sido ligado a A de três formas. Se a ligação foi através do passo 1, então B = a+(b−2)i ou B = (a+1)+(b−1)i. Logo, A−B = a+(b−1)i−a−(b−2)i = i
ou A − B = a + (b − 1)i − (a + 1) − (b − 1)i = −1. Logo, A − B ∼
= i (mod α) ou
0
∼
A − B = −1 (mod α) e, portanto, (A + (α), B + (α)) ∈ E . Se B foi ligado pelo
passo 2, então B = 0. Assim, A − B = a + (b − 1)i = α − i e, dessa forma,
A − B ≡ −i (mod α), ou seja, (A + (α), B + (α)) ∈ E 0 . A última possibilidade
é B ser ligado pelo passo 5, o que nos dá B = a + b − 1 + (b − 1 − a)i. Então
A − B = a + (b − 1)i − (a + b − 1 + (b − 1 − a)i) = a + bi − i − a − b + 1 − (b − 1 − a)i =
bi − i − b + 1 − bi + i + ai = −b + ai + 1 = (a + bi)i + 1 = αi + 1, ou seja,
A − B ≡ 1 (mod α) e, portanto, (A + (α), B + (α)) ∈ E 0 .
14o caso: x = a + b − 1 e y = b − 1
B pode ter sido ligado a A de três formas. Se foi através do passo 1, então
B = a + b − 2 + (b − 1)i ou B = a + b − 1 + (b − 2)i. Logo, A − B = a + b − 1 + (b −
1)i−(a+b−2+(b−1)i) = 1 ou A−B = a+b−1+(b−1)i−(a+b−1+(b−2)i) = i. Logo,
A−B ∼
= 1 (mod α) ou A − B ∼
= i (mod α) e, portanto, (A + (α), B + (α)) ∈ E 0 . Se B
foi ligado pelo passo 2, então B = b−1. Assim, A−B = a+b−1+(b−1)i−(b−1) =
a + b − 1 + bi − i − b + 1 = a + bi − i = α − i. Logo, A − B ≡ −i (mod α) e, consequentemente, (A + (α), B + (α)) ∈ E 0 . A possibilidade restante é de B ter sido ligado
pelo passo 4. Dessa forma, B = (a − 1)i e A − B = a + b − 1 + (b − 1)i − (a − 1)i =
a + b − 1 + bi − i − ai + i = a + bi − ai + b − 1 = (a + bi) + (−i)(a + bi) − 1 =
2.3
Grafos Circulantes e Gaussianos
25
(1 − i)(a + bi) − 1 = (1 − i)α − 1. Com isso, A − B ≡ −1 (mod α) e, portanto,
(A + (α), B + (α)) ∈ E 0 .
15o caso: x = a + b − 1 e 0
Finalmente, B pode ter sido ligado a A através de três formas. Se foi através do
passo 1, então B = a+b−2 ou B = a+b−1+i. Logo, A−B = a+b−1−(a+b−2) = 1
ou A − B = a + b − 1 − (a + b − 1 + i) = −i. Logo, A − B ∼
= 1 (mod α) ou
0
∼
A−B = −i (mod α) e, portanto, (A+(α), B+(α)) ∈ E . Se B foi ligado pelo passo 3,
então B = (a−1)+(a−1)i. Assim, A−B = a+b−1−(a−1)−(a−1)i = b−(a−1)i =
−ai + b − i = (−i)(a + bi) − i = (i)α − i, ou seja, A − B ≡ −i (mod α) e, consequentemente, (A+(α), B +(α)) ∈ E 0 . Por último, se B tiver sido ligado pelo passo 5, então
B = a + ai e A − B = a + b − 1 − (a + ai) = b − 1 − ai = (−i)(a + bi) − 1 = (−i)α − 1.
Portanto, A − B ≡ −1 (mod α) e, com isso, (A + (α), B + (α)) ∈ E 0 .
Teorema 2.2 Seja α = a + bi ∈ Z[i] tal que 0 ≤ a ≤ b, e Gα o grafo gaussiano
gerado por α. Então:
i) Gα ∼
= Ca2 +b2 (a, b) se, e somente se, mdc(a, b) = 1.
ii) Gα ∼
= Tb se, e somente se, a = 0.
Dem.: Sabemos que um grafo circulante é um grafo de Cayley sobre um grupo
cíclico e que, pelo Teorema 1.7, o único caso no qual Z[i]a+bi é cíclico é quando
mdc(a, b) = 1. Também, Z[i]α ∼
= Zb × Zb se, e somente se, a parte real ou a parte
imaginária de α for zero.
Suponha agora que mdc(a, b) = 1. Para o primeiro item, tome α = a + bi.
Temos que CN (α) (a, b) e Gα são grafos isomorfos com o isomorsmo de grafo denido por: Φ : ZN (α) → Z[i]α , com Φ(j) = x + yi (mod α) onde j ≡ ax + by (mod N (α)).
Devemos provar que Φ é uma bijeção que preserva distâncias. Primeiramente, observe que o conjunto de soluções da equação diofantina aX + bY = s(a2 + b2 ) é
{(X, Y ) = (sa + bt, sb − at); t ∈ Z}. Denotemos N = a2 + b2 = N (α).
Primeiramente, mostraremos que Φ está bem denida. Sejam h, j ∈ Z com
h ≡ j (mod N ). Considere j ≡ ax + by (mod N ) e h = ax0 + by 0 (mod N ). Temos que
provar que Φ(j) = Φ(h) (mod α). Assumindo a hipótese, temos a(x−x0 )+b(y −y 0 ) ≡
0 (mod N ), isto é, existe s ∈ Z que verica a(x − x0 ) + b(y − y 0 ) = sN . Agora, se
a(x − x0 ) + b(y − y 0 ) = s(a2 + b2 ), então (x − x0 ) + (y − y 0 )i ≡ 0 (mod α). De fato,
(x−x0 )+(y−y 0 )i = (sa+bt)+(sb−at)i = s(a+bi)+t(b−ai) = s(a+bi)−t(a+bi)i =
(s − ti)(a + bi), de onde é possível concluir esta parte da prova, pois s − ti ∈ Z[i].
Provaremos agora que Φ é injetiva, isto é, que se Φ(j) = Φ(h) (mod α), com
j, h ∈ ZN , então j ≡ h (mod N ). Suponha que Φ(j) = x + yi, Φ(h) = x0 + y 0 i.
Então (x − x0 ) + (y − y 0 )i = γα, com γ ∈ Z[i]. Seja γ = γ1 + γ2 i. Portanto,
(x − x0 ) + (y − y 0 )i = γα = (γ1 a − γ2 b) + (γ1 b + γ2 a)i, então obtemos:
x − x0 = γ1 a − γ2 b ⇒ a(x − x0 ) = γ1 a2 − γ2 ab,
y − y 0 = γ1 b + γ2 a)b(y − y 0 ) = γ1 b2 + γ2 ab.
2.3
Grafos Circulantes e Gaussianos
26
Agora, a(x − x0 ) + b(y − y 0 ) = γ1 (a2 + b2 ), com γ1 ∈ Z, ou seja, j ≡ h (mod N ).
Além disso, Φ é sobrejetiva. Dado um elemento x + yi ∈ Z[i]α , existe j ∈ ZN (α)
tal que j = ax + by e Φ(j) = x + yi.
Para provar o segundo item, apenas considere o isomorsmo de grafo entre o
Torus Tb com b2 vértices e Gb .
Φ0 : Zb × Zb → Z[i]b , com Φ0 (x, y) = x + yi (mod b)
Pelos teoremas anteriores cam bem determinadas as topologias que um grafo
gaussiano pode assumir. Observe que o Teorema 2.2 dá condições para que um grafo
gaussiano seja isomorfo a um grafo circulante. Veja o exemplo a seguir:
Exemplo 2.5 Como mdc(2, 3) = 1, os grafos C1 3(2, 3) e G2+3i são isomorfos.
Figura 2.7: Grafos isomorfos
2.3.1
Diâmetro e Distância média de um grafo Gaussiano
Nesta seção, encontramos expressões gerais para o diâmetro e a distância média
de um grafo gaussiano, que são necessárias nos próximos resultados deste capítulo.
Primeiramente, denimos a distância entre dois vértices em um grafo gaussiano
Gα
pela fórmula
Dα (β, γ) = M in{|x| + |y||(β − γ) ≡ x + yi (mod α)}.
D é uma distância. Para isso, considere β, γ e η ∈ Gα .
i) Dα (β, γ) ≥ 0 e Dα (β, γ) = 0 se, e somente se, β = γ .
De fato, o conjunto {|x| + |y||(β − γ) ≡ x + yi (mod α)} é formado apenas por
números da forma |x| + |y|, que são positivos. Agora, se β = γ , então Dα (β, γ) =
{|x| + |y||0 ≡ x + yi (mod α)}. Como x + yi = 0 + 0i ≡ 0, então o mínimo desse
conjunto será |0| + |0| = 0. Por outro lado, se Dα (β, γ) = 0, então o mínimo do
conjunto {|x| + |y||(β − γ) ≡ x + yi (mod α)} será 0, ou seja, existem x, y tais que
|x| + |y| = 0 e x + yi ≡ β − γ (mod α). Portanto, x, y são nulos e x + yi = 0. Com
isso, 0 ≡ β − γ (mod α) e dessa forma γ ≡ β (mod α).
Provemos que
2.3
Grafos Circulantes e Gaussianos
27
Dα (β, γ) = Dα (γ, β)
β −γ ≡ γ −β (mod α) e assim os conjuntos {|x|+|y||(β −γ) ≡
x + yi (mod α)} e {|x| + |y||(γ − β) ≡ x + yi (mod α)} são iguais.
iii) Dα (β, η) ≤ Dα (β, γ) + Dα (γ, η)
Por denição, Dα (β, γ) = M in{|x| + |y||(β − γ) ≡ x + yi (mod α)} e Dα (γ, η) =
M in{|x| + |y||(γ − η) ≡ x + yi (mod α)}. Sejam então x0 , y 0 tais que |x0 | + |y 0 | é
00
00
um mínimo de {|x| + |y||(β − γ) ≡ x + yi (mod α)} e |x | + |y | é um mínimo de
{|x| + |y||(γ − η) ≡ x + yi (mod α)}. Assim, x0 + y 0 i ≡ β − γ (mod α) e x00 + y 00 i ≡
γ − η (mod α). De onde concluímos que x0 + x00 + (y 0 + y 00 )i ≡ β − η (mod α),
0
00
0
00
ou seja, |x + x | + |y + y | ∈ {|x| + |y||(β − η) ≡ x + yi (mod α)}. Com isso,
Dα (β, η) ≤ |x0 + x00 | + |y 0 + y 00 |. Por outro lado, |x0 + x00 | + |y 0 + y 00 | ≤ |x0 | + |x00 | +
|y 0 | + |y 00 | = Dα (β, γ) + Dα (γ, η). Logo, Dα (β, η) ≤ Dα (β, γ) + Dα (γ, η).
ii)
Isso ocorre porque
Como
Gα
é vértice-simétrico, podemos denir o peso de um vértice (ou sua dis-
tância ao vértice 0) da seguinte forma:
ωα (β) = Dα (β, 0) = M in{|x| + |y||β ≡ x + yi (mod α)}
Para calcular a distribuição de distâncias de um grafo gaussiano é suciente encontrar seu número de vértices de peso
s,
para
s
variando entre
diâmetro do grafo. Este número será denotado por
0
e
k,
onde
k
é o
∆α (s).
Os teoremas a seguir determinam a distribuição de distâncias para grafos gaussianos de ordem par e ímpar, respectivamente.
Mas antes, considere o seguinte
Lema.
Lema 2.3 Dado 0 6= α = a + bi ∈ Z[i], denimos |α| = |a| + |b|.
i) Se 0 6= γ ∈ Z[i], então |α| ≤ |γα|.
ii) Se a < b e 0 6= α ∈ Z[i], então |α| = |γα| se, e somente se, |γ| = 1.
iii) Se γ ∈ Z[i] e 0 ≤ a ≤ b, então se |αγ| < 2b, tem-se |γ| ≤ 1.
Dem.: Seja γ = u + vi ∈ Z[i]. Então γα = (au − bv) + (av + bu)i. Vamos provar
apenas o caso em que a e b são positivos.
(i) Para provar o primeiro item, analisaremos os valores que uv pode assumir:
Se uv > 0, então u e v têm sinais iguais. Caso ambos sejam positivos, temos
|γα| = |au − bv| + |av + bu| ≥ |av + bu| = |av| + |bu| = |a||v| + |b||u| ≥ |a| + |b| = |α|.
A última desigualdade deve-se ao fato de u, v ∈ Z. Se u e v forem inteiros negativos,
então |γα| = |au − bv| + |av + bu| ≥ |av + bu| = | − 1||(av + bu)| = | − (av + bu)| =
| − av − bu| ≥ | − va| + | − ub| ≥ |a||v| + |b||u| ≥ |a| + |b| = |α|.
Se uv < 0, então u e v têm sinais diferentes. Assim, se u é positivo e v negativo,
temos |γα| = |au − bv| + |av + bu| ≥ |au − bv| = |au| + | − bv| ≥ |a| + |b| = |α|.
Por outro lado, se u é negativo e v positivo, então |au − bv| = | − 1||au − bv| =
| − (−au + bv)| = | − au + bv)| ≥ | − au| + |vb| ≥ |a||u| + |v||b| ≥ |a| + |b| = |α|.
Se u = 0 e v 6= 0, então |γα| = | − bv| + |av| = |v||b| + |a||v| = |v|(|a| + |b|) ≥
|a| + |b| = |α|.
Se u 6= 0 e v = 0, então |γα| = |au| + |bu| = |u||a| + |b||u| = |u|(|a| + |b|) ≥
|a| + |b| = |α|.
2.3
Grafos Circulantes e Gaussianos
28
(ii) Para o segundo item, suponha que |γ| = 1. Então |u| + |v| = 1. Como u
e v são inteiros, então |u| = 1 e |v| = 0 ou |u| = 0 e |v| = 1. No primeiro caso,
|γα| = |(au−bv)+(av+bu)i| = |(au)+(bu)i| = |u(a+bi)| = |u||a+bi| = |a|+|b| = |α|.
No segundo caso, |γα| = | − bv + avi| = |v(−b + ai)| = |v(−b + ai)| = |v|| − b + ai| =
|a| + |b| = |α|.
Suponha agora que |α| = |γα|. O conjunto de pontos para os quais a norma
denida no Lema é igual ao valor |α| é dado por {c+di ∈ Z[i], |c|+|d| = |α|}. Vamos
procurar nesse conjunto vetores γ = u + vi tais que |αγ| = |α|. Para isso, iremos
separar o conjunto em 4 partes, sendo cada uma, um segmento de reta localizado em
um dos quadrantes. Cada região possui um vetor representante, que possui norma
idêntica a de α = a + bi. No segundo quadrante, esse vetor é ai − b. No terceiro,
temos −a − bi e no quarto, o vetor é −ai + b (Veja a gura 2.6). É importante
observar que nos complexos, fora dessas regiões, não há outros vetores cuja norma
seja igual à de |α| = |a| + |b|.
Figura 2.8: Pontos cuja norma é igual à
|α|
1o quadrante:
Neste caso, devemos resolver:
a + bi = (u + vi)(a + bi)
a + bi = au − bv + (bu + av)i
Assim,
temos o sistema linear com variáveis inteiras u e v :
a = au − bv
b = bu + av
A solução é u = 1 e v = 0, ou seja, |γ| = 1.
2o quadrante:
Neste caso, devemos resolver:
ai − b = (u + vi)(a + bi)
ai − b = au − bv + (bu + av)i
Da
expressão acima, temos o sistema linear com variáveis inteiras u e v :
−b = au − bv
a = bu + av
A solução é u = 0 e v = 1, ou seja, |γ| = 1.
3o quadrante:
2.3
Grafos Circulantes e Gaussianos
29
Neste caso, devemos resolver:
−a − bi = (u + vi)(a + bi)
−a − bi = au − bv + (bu + av)i
Então
temos o sistema linear com variáveis inteiras u e v :
−a = au − bv
−b = bu + av
A solução é u = −1 e v = 0, ou seja, |γ| = 1.
4o quadrante:
Neste caso, devemos resolver:
−ai + b = (u + vi)(a + bi)
−ai + b = au − bv + (bu + av)i
Logo,
temos o sistema linear com variáveis inteiras u e v :
b = au − bv
−a = bu + av
A solução é u = 0 e v = −1, ou seja, |γ| = 1.
(iii) No último item, temos que x2 +y 2 ≤ (|x|+|y|)2 , então N (γα) ≤ |γα|2 < 4b2 .
Portanto, N (γ) < 4 pois N (α) ≥ b2 . Notando que γ ∈ Z[i], devemos apenas vericar
o caso N (γ) = 2, mas isto é direto para obter que neste caso |γα| = 2b.
Para facilitar as demonstrações dos Teoremas 2.3 e 2.4, usaremos a topologia
losangular para os grafos gaussianos.
Teorema 2.3 Seja 0 6= α = a + bi ∈ Z[i] tal que 0 ≤ a ≤ b, N = a2 + b2 um inteiro
ímpar e t = (a + b − 1)/2 . Então a distribuição de distâncias de Gα é como segue:
i) ∆α (0) = 1.
ii) ∆α (s) = 4s, se 1 ≤ s ≤ t.
iii) ∆α (s) = 4(b − s), se t < s ≤ b − 1.
Dem.: Considere primeiramente 0 6= α = a + bi ∈ Z[i], sendo 0 ≤ a ≤ b e
N = a2 +b2 , um inteiro ímpar. Note que, com essa condição, a razão (a+b−1)/2 ≥ 0
é um número inteiro, pois a2 + b2 ≡ 1 (mod 2) se, e somente se, a + b ≡ 1 (mod 2).
Além disso, ∆α (0) = 1, já que 0 é o único inteiro gaussiano cujo peso é nulo, o que
prova o item (i).
Para o segundo item, temos s variando entre 1 e t. Denotaremos o quadrado do
grafo Gα cujos vérices são −t, ti, t e −ti como Qt = {x+yi ∈ Z[i]||x|+|y| ≤ t} (Veja
a gura 2.6). Dois inteiros gaussianos η 6= η 0 ∈ Qt não são congruentes módulo α.
De fato, se fosse η ≡ η 0 (mod α), teríamos η − η 0 = γα para algum γ ∈ Z[i]. Pelo
lema 2.3, ocorreria |η − η 0 | ≥ |α| = a + b. Mas, pela desigualdade triangular, temos
|η−η 0 | ≤ |η|+|η 0 | ≤ 2t = a+b−1, o que é uma contradição. Além disso, o número de
soluções para a equação |η| = s, com s variando de 1 até t, é a quantidade de vértices
que está nas bordas de Qt , ou seja, 4(s − 1) + 4 = 4s. Dessa forma, está provado o
item (ii). Finalmente, considere os casos s = t+1, . . . , b−1. Primeiramente, observe
que para b = a + 3, os quatro inteiros gaussianos (a + 1) + i, (−a − 1) − i, 1 − (a + 1)i
2.3
Grafos Circulantes e Gaussianos
30
e −1 + (a + 1)i têm peso s = a + 2 = (a + b − 1)/2 + 1 = b − 1 e tais vértices não
pertencem à mesma classe módulo α.
Por outro lado, denoteremos como T o triângulo de vértices t+i, (a+1)+(t−a)i
e t + (t − a)i, conforme a gura 2.6. Na região incluída em T , temos (b − s) inteiros
gaussianos η tais que |η| = s, para s = t + 1, . . . , b − 1. O triângulo T não possui
interseção com a região Qt . Se existirem η ∈ Qt e η 0 ∈ T tais que η − η 0 = αγ . para
0 6= γ ∈ Z[i], então |η − η 0 | ≤ |η| + |η 0 | ≤ t + b − 1 < 2b. Pelo Lema 2.3, temos
que γ ∈ {±1, ±i} e as regiões Qt + αγ e T não possuem interseção. Mais ainda,
as regiões T, −T, iT e −iT não se intersectam como pode ser visto na gura 2.6.
Como η ≡ η 0 (mod α) ⇔ η ≡ η 0 + γα , para qualquer γ ∈ Z[i], podemos considerar
os triângulos T, iT − iα, −T + α e −iT + iα para provar que eles não se intersectam.
Estes triângulos são adjacentes, como pode ser vericado na gura 2.6, e dados dois
vértices η e η 0 nestes triângulos, eles satisfazem |η −η 0 | < 2(t−a) = b−a−1 < a+b.
Portanto, pelo Lema 2.3, η e η 0 não são congruentes módulo α.
Figura 2.9: Translações das Regiões
Q, T, −T, iT
e
−iT
Com o Teorema 2.3, vericamos que para o caso
de pesos
s
N
ímpar temos a seguinte tabela
e o número de vértices com esse peso, denotado por
s
∆α (s)
0 1 2 ···
1 4 8 ···
t
t+1
4t 4(b − t + 1)
···
···
∆α (s):
b−2 b−1
8
4
Tabela 2.1: Distribuição de pesos no caso ímpar
A seguir, temos um exemplo de um grafo gaussiano gerado por α = 2 + 7i.
2
2
Note que seu número de elementos é N = 2 + 7 = 53 e, por isso, podemos
2.3
Grafos Circulantes e Gaussianos
31
aplicar o Teorema 2.3 para determinar sua distribuição de distâncias. Neste caso
= 4. Assim, existem 1 vértice com peso 0; 4 (4 · 1) vértices com peso 1;
t = a+b−1
2
8 (4 · 2) vértices com peso 2; 12 (4 · 3) vértices com peso 3; 16 (4 · 4) vértices com peso
4;
8 (4 · (7 − 5))
vértices com peso
5;
e
4 (4 · (7 − 6))
vértices com peso
6.
Na gura,
cada cor corresponde ao peso dos vértices.
Figura 2.10: Distribuição de pesos no grafo gaussiano gerado por 2 + 7i
Teorema 2.4 Seja 0 6= α = a + bi ∈ Z[i] tal que 0 ≤ a ≤ b, N = a2 + b2 um inteiro
par e t = (a + b)/2 . Quando a < b, a distribuição de distâncias do grafo Gα é como
segue:
i) ∆α (0) = 1.
ii) ∆α (s) = 4s, se 0 < s < t.
iii) ∆α (t) = 2(b − 1).
iv) ∆α (s) = 4(b − s), se t < s < b.
v) ∆α (b) = 1.
Quando 0 < a = b, a distribuição de distâncias do grafo Gb+bi é como segue:
i) ∆α (0) = 1.
ii) ∆α (s) = 4s, se 0 < s < b.
iii) ∆α (b) = 2b − 1.
Dem.: Note que N = a2 + b2 ≡ 0 (mod 2) se, e somente se, a + b ≡ 0 (mod 2).
Com isso, (a + b)/2 é um número inteiro. Além disso, podemos escolher a e b dois
inteiros tais que 0 ≤ a ≤ b e de forma que N = a2 + b2 seja par. Obviamente,
∆α (0) = 1, pois 0 é o único inteiro gaussiano com peso igual a 0. Analogamente ao caso ímpar, as regiões Qt−1 e Qt−1 + γα não se intersectam para qualquer
0 6= γ ∈ Z[i]. Dessa forma, os inteiros gaussianos em Qt−1 pertencem a diferentes
classes módulo α, onde Qt−1 = {η||η| ≤ t − 1}. Portanto, no grafo Gα , temos 4s
elementos de peso s, para s = 1, . . . , t − 1 em Qt−1 , o que prova o segundo item para
ambos os casos.
2.3
Grafos Circulantes e Gaussianos
32
Consideremos agora a < b. Suponha que s = t = (a + b)/2. Neste caso, consideremos os inteiros gaussianos em quatro segmentos de quatro linhas diretas diferentes. Os dois primeiros são os segmentos S1 = A1 B1 e S2 = A2 B2 , onde A1 =
(t − 1) + i, B1 = ti, A2 = (−1 − a) + (t + 1 − b)i e B2 = (1 − t) − i (Veja a gura
2.8).
Figura 2.11: Translações da Região
Qt−1 ,
Segmentos e Triângulo da Prova
Observe que S1 é uma parte da linha direta denida por S = {x + yi|x + y = t}.
O segundo segmento é uma translação por −α do pedaço desta linha. Dessa forma,
temos (S1 −α)∩S2 = ∅. Os dois segmentos à esquerda são R1 = C1 D1 e R2 = C2 D2 ,
onde C1 = −1 + (t − 1)i, D1 = −t, C2 = (t − a − 1) + (−1 − a)i e D2 = 1 + (1 − t)i.
Note que R1 é um pedaço da linha R = {x + yi| − x + y = t} e R2 é uma translação
de −αi do pedaço desta linha. Temos ainda que (R1 − αi) ∩ R2 = ∅. Podemos
vericar que existem exatamente 2(b − 1) inteiros gaussianos no conjunto de pontos
pertencentes a S1 ∪ S2 ∪ R1 ∪ R2 . Mostraremos que para qualquer par de inteiros
gaussianos η, η 0 neste conjunto de pontos não são congruentes módulo α. Como
|η − η 0 | ≤ |η| + |η 0 | ≤ 2t = a + b < 2b, pelo Lema 2.3, temos que η − η 0 = uα, com
u ∈ {±1, ±i}. A partir do comentário anterior é possível perceber que isto nunca
ocorre.
Agora, consideremos os casos s = t + 1, . . . , b − 1. Note apenas que este caso
existe somente quando b ≥ a + 4. Primeiro, note que no caso b = a + 4 os quatro
inteiros gaussianos (a + 1) + 2i, (−a − 1) − 2i, 2 − (a + 1)i e −2 + (a + 1)i têm peso
s = a + 3 = b − 1. Estes inteiros gaussianos não pertencem à mesma classe módulo
α.
Por outro lado, denotaremos o triângulo de vértices (t − 1) + 2i, (t − 1) + (t − a)i
e (a + 1) + (t − a)i como T . Na região T temos (b − s) inteiros gaussianos η tais que
|η| = s, para s = t + 1, . . . , b − 1. Analogamente, para o caso ímpar, o triângulo T
não intersecta a região Qt−1 ∪ S1 ∪ S2 ∪ R1 ∪ R2 ⊂ Qt . Se existirem η ∈ Qt e η 0 ∈ T
tais que η − η 0 = αγ para 0 6= γ ∈ Z[i], então |η − η 0 | ≤ |η| + |η 0 | ≤ t + b − 1 < 2b.
Pelo Lema 2.3, temos que γ ∈ {±1, ±i} e as regiões Qt +αγ e T não se intersectam.
Mais ainda, os triângulos T, −T, iT e −iT não possuem interseção, o que conclui a
prova deste item.
2.3
Grafos Circulantes e Gaussianos
33
Finalmente, os quatro inteiros gaussianos t + (t − a)i, (a − t) + ti, −t + (a − t)i
e (t − a) − ti têm peso b. Os quatro pontos pertecem à mesma classe módulo α,
então selecionamos o primeiro t + (t − a)i como representante de peso b. Para
o caso particular onde 0 < a = b, os dois primeiros itens são provados equivalentemente para o caso a < b. Para o terceiro item, como t = (a + b)/2 = b,
temos que as três regiões especicadas no caso anterior, na verdade são apenas
uma região. Esta região é denida pelos segmentos T1 = E1 F1 e T2 = E2 F2 , onde
E1 = (b − 1) + i, F1 = ti, E2 = 1 + (b − 1)i e F2 = (b − 1) + i. Esta região tem
exatamente 2b − 1 pontos e, seguindo passos similares para o caso anterior, é fácil
ver que eles não todos classes diferentes módulo α.
Com o Teorema 2.4, vericamos que para o caso
tabela de pesos
s
s
∆α (s)
N
par e
a<b
temos a seguinte
e o número de vértices com esse peso, denotado por
0 1 2 ···
1 4 8 ···
t
t+1
2(b − 1) 4(b − t + 1)
···
···
b−1 b
4
1
Tabela 2.2: Distribuição de pesos no caso par com
Utilizando também o Teorema 2.4, para o caso
N
par e
∆α (s):
a<b
0 < a = b,
temos a
seguinte tabela:
s
0 1
∆α (s) 1 4
2 ···
8 ···
b−1
b
4b − 4 2b − 1
Tabela 2.3: Distribuição de pesos no caso par com
a=b
A seguir, considere como exemplo o grafo gaussiano gerado por α = 3 + 5i, cujo
2
2
número de vértices é N = 3 + 5 = 34. Nele, podemos aplicar o primeiro caso
(a < b) do Teorema 2.4 para determinar sua distribuição de distâncias. Note que
t = a+b
= 4. Assim, existem 1 vértice com peso 0, 4 (4 · 1) vértices com peso 1;
2
8 (4 · 2) vértices com peso 2; 12 (4 · 3) vértices com peso 3; 8 (2 · (5 − 1)) vértices com
peso 4; e 1 vértice com peso 5(b).
Corolário 2.1 Seja 0 6= α = a + bi ∈ Z[i] tal que 0 ≤ a ≤ b. Considere N = a2 + b2
a norma de α. O diâmetro k do grafo gaussiano Ga+bi é dado por: k = b se N é
par ou k = b − 1 se N é ímpar.
2.3
Grafos Circulantes e Gaussianos
34
Dem.: Pela Denição 2.6, o diâmetro k de G é o tamanho do maior entre todos
os menores caminhos de cada par de vértices possíveis do grafo. Além disso, Ga+bi
é vértice-simétrico. Dessa forma podemos xar um ponto qualquer e calcular qual é
o maior de todos os caminhos mais curtos entre um outro vértice e o xado. Este
será o diâmetro de Ga+bi . Por conveniência, xamos o vértice 0, pois sua distância
a um outro vértice v qualquer será Dα (0, v), ou seja, o peso de v , que é denotado
por ωα (v). Observando os Teoremas 2.3 e 2.4, notamos que o maior peso para o
caso N par é b e o maior peso para o caso em que N é ímpar será dado por b − 1.
Corolário 2.2 Seja 0 6= α = a + bi ∈ Z[i] tal que 0 ≤ a ≤ b. Considere N = a2 + b2
a norma de α. Então a distância média k do grafo gaussiano Gα é k =
2 −1)
se N é par ou k = 3b(N −1)+2a(a
se N é ímpar.
6(N −1)
Dem.:
a distânciaPmédia será dada por:
P Para o caso N ímpar,
P
u∈V,u6=u0
k=
Dα (u,u0 )
]V −1
Dα (u,0)
]V −1
u∈V,u6=0
=
=
3bN +2a(a2 −1)
6(N −1)
ωα (u)
N −1
06=u∈V
Vamos calcular separadamente o numerador dessa fração. Ele pode ser obtido
através do Teorema 2.3:
P
4(b − s)s
4s2 + b−1
Pb−1
Pt 2 t+1
= 4( 1 s + t+1 (b − s)s)
Pb−1 2
P
P
s
−
= 4( t1 s2 + b b−1
t+1 s )
t+1
t(t+1)(2t+1)
(b−1)(b−1+1)
= 4(
+ b(
− t(t+1)
) − ( (b−1)(b)(2b−2+1)
−
6
2
2
6
8 3
4
2
2 3
2
= 3 t + (4 − 2b)t + ( 3 − 2b)t − 3 b + 3 b
Pt
1
Substituindo t por
a+b−1
2
, temos:
8 a+b−1 3
( 2 ) + (4 − 2b)( a+b−1
)2
3
2
3
3
a
+ b2 − a3 + 12 a2 b − 12 b
3
3
2a +3b3 −2a+3a2 b−3b
6
3b(a2 +b2 −1)+2a(a2−1)
6
3b(N −1)+2a(a2−1)
6
Portanto, k =
t(t+1)(2t+1)
))
6
+ ( 43 − 2b)( a+b−1
) − 23 b + 23 b3
2
3b(N −1)+2a(a2 −1)
6(N −1)
Para
o caso N par, com a < b, a distância média será dada por:
P
ωα (u)
N −1
06=u∈V
Calculando separadamente o numerador da fração acima, através dos dados do
Teorema 2.4, ele é dado por:
Pt−1
1
4s2 + 2(b − 1)t +
Pb−1
t+1
4(b − s)s + b
2.3
Grafos Circulantes e Gaussianos
35
P
P
Pb−1 2
4 1t−1 s2 + 4b b−1
t+1 s − 4
t+1 s + 2(b − 1)t + b
(b−1)b
t(t+1)
(t−1)(t)(2t−2+1)
+4b( 2 − 2 )−4( (b−1)(b−1+1)(2b−2+1)
− t(t+1)(2t+1)
)+2bt−2t+b
4
6
6
6
Simplicando, obtemos:
8 3
t
3
− 2bt2 − 32 t + 13 b + 23 b3
:
Substituindo t por
a+b
2
8 a+b 3
( 2 ) − 2b( a+b
)2
3
2
3
3
2
− a3 + a3 + b2 + a2 b
−2a+2a3 +3b2 +3a2 b
6
3b(a2 +b2 )+2a(a2 −1)
6
3bN +2a(a2 −1)
6
− 23 ( a+b
) + 31 b + 23 b3
2
Portanto, k =
3bN +2a(a2 −1)
6(N −1)
.
Finalmente,
para o caso N par, com 0 < a = b, a distância média será dada por:
P
ωα (u)
N −1
06=u∈V
Calculando separadamente o numerador da fração acima, através dos dados do
Teorema 2.4, ele é dado por:
Pb−1 2
4s + (2b − 1)b
1
P
b−1 2
4 1 s + 2b2 − b
4 (b−1)(b)(2b−1)
+ 2b2 − b
6
4 3
1
−3b + 3b
Como neste caso b = t, podemos substituir b por
+ 43 ( a+b
)3
− 13 a+b
2
2
Portanto, k =
3bN +2a(a2 −1)
6(N −1)
a+b
2
.
.
Capítulo 3
O problema do caminho mais curto
Neste capítulo, consideramos o problema do caminho mais curto e explicamos como
resolvê-lo para as classe dos grafos Circulantes e Gaussianos, dando um simples algoritmo de roteamento, ou seja, um algoritmo que, a partir de um par de vértices,
roteia uma mensagem do vértice fonte para o vértice destino.
Sendo
u
e
v
dois vértices do grafo conexo
G,
o caminho mais curto entre
é uma sequência de arestas que, passando por vértices distintos, liga
u
e
v
u
e
v
de for-
ma a acumular o menor comprimento, ou distância. Trata-se de um dos problemas
mais conhecidos e antigos da humanidade e como solução destaca-se o Algoritmo
de Dijkstra (1959), ilustrado a seguir, que, apesar de ter uma fácil implementação
computacional e de calcular as menores distâncias de um vértice inicial a todos os
outros apenas com a restrição de que não haja arcos negativos no grafo, sua ordem
2
de complexidade é O(n ). Portanto, o custo computacional desse algoritmo, que
pode ser utilizado em um grafo qualquer, pode ser muito alto. Mas como as classes
de grafos que são objetos de estudo deste trabalho têm uma estrutura especíca,
algoritmos podem ser implementados aproveitando suas peculiaridades.
3.1
Algoritmo de Dijkstra
Em 1959, Dijsktra sugeriu um algoritmo de rotulação para caminhos em grafos
com arcos positivos utilizando indução e ajuste, eciente e de fácil implementação
computacional. Chamando de:
•
Lista
F
(lista dos nós fechados): conjunto dos vértices para o qual já se conhece
um caminho mínimo
•
Lista
A
(lista de nós abertos):
conjunto dos nós para o qual ainda não se
conhece um caminho mínimo
• i:
contador de iterações
• V:
• r:
representando o conjunto os nós rotulados e abertos em
índice do vértice a ser fechado na iteração t
36
G
3.2
O problema do caminho mais curto
• C = [Cij ] :
37
matriz dos custos representando as distâncias entre vértices ligados
diretamente
• dij :
a distância entre os vértice
• dtij :
a distância calculada entre os vértices
• rot(i):
e
xj
xi
e
xj
na iteração
t
vetor que guarda o vértice que deu origem à distância calculada para
o vértice de índice
• Γ+ (r)
xi
i
: conjunto de vizinhos do vértice de índice
r
Podemos escrever o algoritmo como segue:
Algoritmo de Dijkstra (Caminho mais Curto)
INÍCIO
Ler os dados de
G = (N, d),
onde
dij
é a distância entre os nós vizinhos de G
d11 ← 0;
{d1i ← ∞, ∀i ∈ N − {x1 }} ;
V ← {x1 };
A ← {N };
F ← ∅;
{rot(i) ← 0, ∀i ∈ N }
Para t = 1 a n fazer
{d1j }
r ← xi tal que d1i ← xmin
i ∈A
F ← F ∪ {r};
A ← A − {r};
V ← A ∩ Γ+ (r)
Para i ∈ V fazer
t−1
p ← min{d1i
, (d1r + dr1 )}
t−1
Se p < d1i , então
t−1
d1i
← p;
rot(i) ← r;
Fim
Fim
Fim
FIM
Observe que para cada vértice
para aproximar a distância
v
até
u em V é
u em G.
denido um rótulo
comprimento do melhor caminho encontrado até o momento de
d11 = 0
e
D1i = ∞,
para cada
u 6= v
e denimos o conjunto
que será usado
F
v até u.
Inicialmente,
inicialmente vazio. A
F com o menor
rótulo dij e coloca-se em F . Na primeira iteração, F conterá apenas v . Quando um
novo vértice entra em F , são atualizados todos os rótulos dij , em que z é um vértice
adjacente a u e não está em F , reetindo o fato de que pode haver uma nova e melhor
maneira de chegar a z via u. Esta atualização é conhecida como relaxamento, que
em Djkstra é feito para uma aresta (u, z) de forma que se calcula um novo valor para
D[u] e deseja-se vericar se há um valor melhor para D[z] usando a aresta (u, z).
cada iteração, seleciona-se um vértice
u
dij ,
Estes rótulos armazenarão sempre o
que não está no conjunto
3.2
O problema do caminho mais curto
3.2
38
Roteamento em Grafos Circulantes
Ao longo dos anos, muitos esforços foram feitos para se obter algoritmos ótimos que
encontrem caminhos mínimos em grafos circulantes. Tais algoritmos consideram grafos cujos vértices são rotulados por inteiros. Se
CN (j1 , j2 ), um caminho mais
|y| saltos em j2 , onde x, y ∈ Z.
circulante
em
j1
e
n, m ∈ ZN são dois vértices do grafo
n para m consistirá em |x| saltos
curto de
Consequentemente, todos estes algoritmos
de roteamento podem ter um passo de pré-processamento comum
Calcular(x, y).
Por conseguinte, um algoritmo de roteamento genérico poderia ser como o descrito
no Algoritmo 1. Ele faz o cálculo do caminho mais curto em grafos circulantes de
grau quatro e foi apresentado por Robic (1996)
apud
Martínez (2007).
entrada: X,Y
saída: m,n
início
PASSO 1. CALCULE(X, Y);
PASSO 2. para i := 0 até |x| faça n = n + sign(x) j_1 (mod N);
PASSO 3. para i := 0 até |y| faça m := m + sign(y) j_2 (mod N);
fim Algoritmo 1:
No Passo 1, calcula-se o par
com
|x| + |y|
(x, y) ∈ Z × Z
tal que
n − m ≡ xj1 + yj2 (mod N )
mínimo.
Os Passos 2 e 3 tomam
|x| + |y| < k
saltos, onde
k
é o diâmetro do grafo. A
complexidade computacional deste algoritmo é da ordem de complexidade do Passo
1 mais
O(k).
Por essa razão, a maioria dos artigos sobre roteamento em grafos cir-
culantes focalizam em algoritmos para resolver o Passo 1, com o objetivo de reduzir
seu custo de roteamento.
3.2.1
Programa para Roteamento em Grafos Circulantes
Na Figura 3.1, temos um exemplo de um grafo circulante com dois saltos. Ele foi
desenvolvido baseado no fato que os
N
vértices podem ser representados sobre um
cos(i ∗ arg), sen(i ∗ arg) para as
i varia de 0 a N − 1 e arg = (2 ∗ pi)/N . As arestas
círculo, igualmente espaçados, usando as fórmulas
coordenadas de cada ponto, onde
são calculadas conforme a Denição 2.10 de grafos circulantes.
3.2
O problema do caminho mais curto
39
Figura 3.1: Grafo Circulante com 18 vértices e saltos 3 e 5
Apresentamos os resultados do algoritmo que trata do roteamento em um grafo
circulante. Para exemplicar, considere o caso em que temos o grafo
C18 (3, 5),
ou
seja, um grafo circulante com 18 vértices e saltos 3 e 5. Nele, queremos encontrar
o menor caminho que vai do vértice 1 ao vértice 12. Na saída do programa, obtemos como resultado, que o caminho deve ser feito pelo vetor
[+1 − 2],
que signica
caminhar, a partir do vértice 1, 1 passo no sentido anti-horário com o salto 3 e 2
passos no sentido horário com o salto 5. Na ilustração da Figura 3.2, gerada pelo
programa, vemos o caminho descrito acima. O passo dado com o salto 3 está mostrado pela linha tracejada e os passos dados com salto 5 estão mostrados pela linha
contínua.
Figura 3.2: Menor caminho entre os vértices 1 e 12 do Grafo Circulante
C18 (3, 5)
O programa, desenvolvido para o roteamento em grafos circulantes quaisquer,
possui como parâmetros de entrada, as seguintes variáveis:
3.2
O problema do caminho mais curto
• N:
40
número de vértices do grafo circulante
• A, B :
saltos do grafo circulante
• m, n:
vértices do grafo nos quais será feita a busca do menor caminho entre
eles
Durante sua execução, ele tem como objetivo determinar menor caminho entre os
m, n ∈ ZN , indo de m a n. Para isso, deve-se resolver a equação diofantina:
xA + yB = m − n + kN , com |x| + |y| mínimo e k inteiro.
Primeiramente, o programa verica se n > m ou m > n. Caso aconteça a
segunda opção, as variáveis são trocadas, a m de se manter em n o vértice com
vértices
maior valor.
Em seguida, escolhe o melhor sentido para busca (horário ou anti-
horário) vericando o quão próximos estão os vértices
m, n.
Isso se justica, pois a
disposição dos mesmos é feita de forma circular. Assim, num grafo circulante de 15
vértices, por exemplo, os vértices 1 e 14 estão mais próximos do que 1 e 6. Assim,
se
n − m > N − (n − m),
tomamos
c = n − m − N,
n−m
c = n − m e,
indicando que o sinal de
será trocado, pois o sentido de busca será horário.
Caso contrário,
dessa forma, o sinal permanece, porque o sentido da busca será anti-horário.
Então executa-se um algoritmo auxiliar (Euclides Estendido), baseado nos re-
Ax0 + By0 = 1, a partir dos
parâmetros A e B , o que retornará um vetor euc = [x0 y0 mdc(A, B)].
Depois disso, é chamada uma outra rotina que calcula X, Y tais que AX + BY =
c, com |X| + |Y | mínimo e c sendo um número inteiro da forma kN + (m − n). Tal
sultados do Capítulo 2, que calcula
x0
e
y0
tais que
rotina baseia-se em um resultado importante da álgebra abstrata, que aproveita da
estrutura de equação diofantina do problema para resolvê-lo. Ele diz que se tiver-
a, b e c inteiros tais que d = mdc(a, b) divide c, então escrevendo d na forma
d = ra + sb, com r; s ∈ Z, temos que as soluções da equação diofantina são da forma
x = r dc + db t; y = s dc − ad t, com t ∈ Z.
c
b
c
a
Observe que devemos minimizar a função inteira f (t) = |r + t|+|s − t|, t ∈ Z.
d
d
d
d
c
b
c
a
Considere então g(t) = r + t e h(t) = s − t, que são funções lineares. Se
d
d
d
d
tomarmos as funções |g(t)| e |h(t)|, supondo a variável t real, simultaneamente no
mos
mesmo gráco, teremos um esboço como o da gura 3.3:
Figura 3.3: Gráco das funções
|g|
e
|h|
Evidentemente, as inclinações podem variar, assim como as posições das funções
0
no gráco. Mas o importante é notar que entre r e r haverá uma interseção I , fácil
3.3
O problema do caminho mais curto
41
de ser obtida algebricamente, que será o mínimo para a soma
Observe que as funções
f
e
|g(t)| + |h(t)|
|g(t)| + |h(t)|, t ∈ R.
possuem a mesma expressão algébrica.
Entretanto, na primeira, a variável é inteira, enquanto na segunda a variável é real.
t0 do valor real I , assim como o
|X| + |Y | = |r dc + db t| + |s dc − ad t|
Dessa forma, o programa considera o menor inteiro
maior inteiro de
I
como parâmetros na solução de
mínimo, vericando qual dos dois é menor.
X, Y calculados, o programa verica qual k é o melhor de tal forc = kN + (m − n) gere o melhor par X, Y . Ao variar k , temos números
congruentes módulo N . Após esse passo, o algoritmo busca a melhor solução entre
A partir de
ma que
as dez calculadas e, a partir dela, faz uma ilustração do menor caminho no grafo
circulante, indicando com cada cor, o salto utilizado.
O programa ainda gera na sua saída uma matriz
uma solução para o problema.
necessários para
A
w,
onde cada linha apresenta
Na primeira coluna, temos o número de saltos
e, na segunda, para o
B.
Em ambos, se o número for posi-
tivo, a rotação é no sentindo anti-horário e se for negativo, a rotação é no sentindo
w, aparece o número total de saltos a serem utilizados
z , também exibida na saída, indica a linha da matriz w
horário. Na terceira coluna de
no roteamento. A variável
com solução mais eciente.
Os códigos-fontes das funções auxiliares utilizadas nesse programa estão no anexo
1, na seção de roteamento de grafos circulantes.
3.3
Roteamento em Grafos Gaussianos
Como em grafos circulantes de grau quatro, se quisermos achar o caminho de um
0
vértice fonte η para um vértice destino η em um grafo Gaussiano, teremos que calcu0
lar r = r1 + ir2 ≡ η − η (mod α) com |r1 | + |r2 | mínimo. Então qualquer combinação
de
r1
saltos na dimensão real e
r2
saltos na dimensão imaginária nos dará uma li0
gação de caminho mais curto entre o vértice de fonte η e o vértice destino η . Um
algoritmo de roteamento semelhante ao apresentado no Algoritmo 1 também pode
ser usado em grafos Gaussianos.
r = r1 + r2 i com |r1 | + |r2 | mínimo.
Martínez (2007) propõe um algoritmo que acha
Este algoritmo está baseado no próximo teorema
e tira vantagem da rotulação dos vértices em termos de inteiros Gaussianos.
Teorema 3.1 Seja 0 6= α = a + bi ∈ Z[i] e k o diâmetro de Gα . Sejam η = x + yi
e η 0 = x0 + y 0 i tais que |x| + |y| ≤ k e |x0 | + |y 0 | ≤ k . Se r ≡ (η 0 − η) (mod α) é tal
que |Re(r)| + |Im(r)| é mínima, então r = (η 0 − η) + γα com γ ∈ {0, ±1, ±i, ±(1 +
i), ±(1 − i), ±2, ±2i}.
Dem.: Usaremos a distribuição de distâncias introduzida nos Teoremas 2.3 e
2.4. De acordo com o Teorema 2.3, se N = a2 + b2 é ímpar, a norma máxima é
+ b−a−1
i ou qualquer um de seus associados. Logo,
obtida para o vértice δ = a+b−1
2
2
2
2
temos que N (δ) = ( a+b−1
)2 + ( b−a−1
)2 = a +(b−1)
.
2
2
2
Agora, dados η = x+yi e η 0 = x0 +y 0 i, como r = (η 0 −η)+αγ com |Re(r)|+|Im(r)|
mínimo, obtemos que γα = r − (η 0 − η). Aplicando a norma em ambos os lados da
2
2
iguadade, obtemos: N (γα) = N (r − (η 0 − η)) ≤ N (3δ) = 9 a +(b−1)
.
2
3.3
O problema do caminho mais curto
42
Por outro lado, N (γα) = N (γ)N (α). Então N (γ) = NN(γα)
. Como N (α) =
(α)
2 +(b−1)2
a
a2 + b2 , concluímos que N (γ) ≤ 92 a2 +b2 < 92 . Os únicos valores possíveis de
γ que satisfazem a desigualdade são {0, ±1, ±i, ±(1 + i), ±(1 − i), ±2, ±2i}. Se
+ b−a
i. Temos que
N é par, a norma máxima é alcançada pelo vértice δ = a+b
2
2
2
2
a+b 2
b−a 2
a +b
N (δ) = ( 2 ) + ( 2 ) = 2 . Assim, com passos análogos ao primeiro passo,
obtemos as mesmas restrições para a norma de γ .
Desta forma, com base no Teorema 3.1, o algoritmo a seguir apresenta uma
versão paralela do cálculo de distância mais curta para qualquer Grafo Gaussiano.
Dados: x + yi: Fonte; x' + y'i: Destino; a + bi: grafo gerador
Resultado: r_1+r_2 i
mínimo
(x_0-x)+(y_0-y)i (mod a+bi): com |r_1|+|r_2|
início
x_0 := x' - x; y_0 := y' - y;
FAÇA EM PARALELO:
x_1 := x_0 - a; y_1 := y_0 - b;
x_2 := x_0 + a; y_2 := y_0 + b;
x_3 := x_0 - b; y_3 := y_0 + a;
x_4 := x_0 + b; y_4 := y_0 - a;
x_5 := x_0 + (a - b); y_5 := y_0 + (a + b);
x_6 := x_0 - (a - b); y_6 := y_0 - (a + b);
x_7 := x_0 + (a + b); y_7 := y_0 + (b - a);
x_8 := x_0 - (a + b); y_8 := y_0 - (b - a);
x_9 := x_0 + 2a; y9 := y_0 + 2b;
x_1 0 := x_0 - 2a; y10 := y_0-2b
x_{11} := x_0 - 2b; y_{11} := y_0 + 2a;
x_{12} := x_0 + 2b; y_{12} := y_0 - 2a;
FIM DO FAZER EM PARALELO
(r_1, r_2) := (x_i, y_i) tal que |x_i| + |y_i| é mínimo;
fim
Note que no Algoritmo 2 são necessárias apenas somas e comparações para o
0
0
roteamento em grafos Gaussianos. O vértice fonte x + yi e o vértice destino x + y i
3.3
O problema do caminho mais curto
são tais que
|x| + |y| ≤ k
e
|x0 | + |y 0 | ≤ k ,
43
onde
k
é o diâmetro do grafo Gaussiano.
Observe que, para obter o diâmetro, precisamos apenas vericar a paridade de N =
a2 + b2 . Portanto, o FAÇA EM PARALELO no Algoritmo 2 substitui o Passo 1
(Calcular(x, y )) do Algoritmo 1, que é a parte mais cara do processo, usando apenas
12
somas e
14
comparações. Portanto, nesse processo de roteamento, existe a
vantagem de existir uma computação em paralelo, o que reduz signicativamente o
custo computacional.
3.3.1
Programa para Roteamento em Grafos Gaussianos
Na Figura 3.4, temos um Grafo Gaussiano gerado pelo elemento 5 + 8i. Como desN = 52 + 82 = 89 vértices, dispostos de forma que 25
crito anteriormente, ele possui
deles são representados em um quadrado de lado 5 e os 64 restantes em um outro
quadrado de lado 8. Os dois quadrados são justapostos, sendo que o de menor lado
ca à esquerda.
Figura 3.4: Grafo Gaussiano gerado por
5 + 8i
Na Figura 3.5, ilustramos o grafo correspondente ao da Figura 3.4, cujo gerador
é o elemento
5 + 8i.
3.3
O problema do caminho mais curto
44
Figura 3.5: Grafo Gaussiano gerado por
5 + 8i
na topologia losangular
Para o problema de encontrar o menor caminho entre dois vértices de um grafo Gaussiano, foi implementado um programa baseado no Teorema 3.1.
que queremos encontrar o menor caminho entre os vértices
Gaussiano gerado por
5 + 3i
e
7 + 0i
Suponha
do grafo
3+5i. Então o programa dispõe os vértices do grafo Gaussiano
na topologia losangular, de forma que cada vértice dessa topologia representa um
vértice da antiga de tal forma que estão na mesma classe de equivalência e que o
vértice do novo grafo seja o de menor norma possível dentre todos os existentes na
classe.
Evidentemente, essa transformação afeta os vértices
na topologia losangular são
−1 − 2i
e
2 − 2i
5 + 3i
e
7 + 0i,
que
As adjacências são preservadas, o que
garante ao novo grafo ser isomorfo ao anterior. Ao executar o programa, é gerada
em sua saída uma ilustração com um dos menores caminhos (pode existir mais de
um) entre o vértice de origem e o vértice de destino como mostrado na Figura 3.6.
Figura 3.6: Menor caminho entre os vértices 5+3i e 7+0i do grafo gaussiano
G3+5i
3.3
O problema do caminho mais curto
45
O mesmo caminho é ilustrado na Figura 3.7, através da topologia em L.
Podemos concluir que o cálculo da distância mínima em grafos circulantes tem
um custo maior do que em grafos Gaussianos, sendo, dessa forma, vantajosa a utilização do último quando for possível encontrar um isomorfo ao grafo circulante em
questão.
No Anexo 1 estão presentes os códigos-fontes de cada função auxiliar utilizada
no programa para o roteamento em grafos Gaussianos.
Figura 3.7: Menor caminho entre os vértices 5+3i e 7+0i do grafo gaussiano
na topologia em L
G3+5i
Capítulo 4
O problema das árvores geradoras
independentes
Neste capítulo, trabalhamos com o conceito de árvores geradoras independentes. A
construção das mesmas em grafos de forma geral é signicante para aplicações em
redes. No caso de grafos circulantes recursivos, uma subclasse dos grafos circulantes
que deniremos neste capítulo, dentre outras aplicações, tais árvores desempenham
papel fundamental na distribuição de mensagens secretas, por exemplo.
4.1
Árvores Geradoras Independentes (IST)
Para um grafo não-direcionado
G,
considere
P e Q unindo x e y são ditos internamente
E(P ) ∩ E(Q) = ∅ e V (P ) ∩ V (Q) = {x, y}.
minhos
se
x, y ∈ V (G).
Dizemos que dois ca-
disjuntos, denotados por
P ||Q,
Exemplo 4.1 No grafo a seguir, os caminhos P : 0 1 2 7 6 e Q : 0 3 5 6 conectam os
vértices x = 0 e y = 6 e são disjuntos, pois E(P )∩E(Q) = ∅ e V (P )∩V (Q) = {0, 6}.
Por outro lado, os caminhos P : 0 1 2 7 6 e R : 0 3 7 6 não são disjuntos, já que
V (P ) ∩ V (R) = {0, 7, 6}.
Figura 4.1: Exemplo de caminhos disjuntos
46
4.1
O problema das árvores geradoras independentes
47
Denição 4.1 Uma árvore geradora enraizada T de um grafo G é um subgrafo de
G que contém todos os vértices V (G) = V (T ) sem formar ciclos e possui um vértice
especíco como sua raiz.
Exemplo 4.2 Considerando o grafo G do Exemplo 4.1, as árvores seguintes são
árvores geradoras enraizadas no vértice 0.
Figura 4.2: Árvores Geradoras
x, y ∈ V (T ), denotamos por T [x, y] o único caminho de x a y
T e T 0 de um grafo G são ditas independentes (IST) se
0
são enraizadas no mesmo vértice, digamos r , e são tais que T [r, x]||T [r, x] para todo
x 6= r. Observe que no Exemplo 4.2 temos duas árvores geradoras independentes.
em
Se
T
T.
Duas árvores geradoras
é uma árvore e
Dizemos também que um conjunto de árvores geradoras é independente se elas são
duas a duas independentes.
C(N, d), os quais são uma classe especial de grafos circulantes, que possuem um número N de vértices e, como saltos,
potências de um inteiro d, de 0 até dlogd N e − 1. Assim, podemos escrever esses
0 1 2
dlogd N e−1
grafos da seguinte forma C(N, d) = CN (d , d , d , . . . , d
) e os vértices serão
rotulados de 0 a N − 1.
m
Grafos C(N, d) têm uma estrutura recursiva quando N = cd , 1 ≤ c < d e m > 1
Neste capítulo, trabalharemos com os grafos
e são chamados grafos circulantes recursivos ou RC-grafos. Isso signica que um
m
grafo C(cd , d) pode ser denido recursivamente utilizando a seguinte propriedade:
Proposição 4.1 Seja Vi um subconjunto de vértices de G = C(cdm , d) tal que Vi =
{v|v ≡ i (mod d)}, m ≥ 1. Então
(i) Para 0 ≤ i < d, o subgrafo de G(cdm , d) induzido por Vi é isomorfo a
G(cdm−1 , d).
(ii) G pode ser particionado em d subgrafos disjuntos Gi (Vi , Ei )
Dem.:
i) Considere, para cada i, com 0 < i < d, Gi = Gi (Vi , Ei ), o subgrafo de
C(cdm , d) induzido por Vi . Vamos mostrar que Gi ∼
= C(cdm−1 , d). Note que |Vi | =
cdm−1 e que Vi = {i+dj|0 ≤ j ≤ cdm−1 −1}. De fato, se v ∈ Vi , então v = i+dj, t ∈ Z
e 0 ≤ v ≤ cdm − 1. Como 0 ≤ i ≤ d − 1, temos 0 ≤ v − i ≤ v ≤ cdm − 1, o que
m
≤ b cd d−1 c ≤ cdm−1 − 1. Agora, considere a seguinte função:
implica 0 ≤ t = v−i
d
4.1
O problema das árvores geradoras independentes
48
Gi
→ C(cdm−1 , d)
i + dj 7→
j
Claramente, ϕ é bijetora. Seja (i + dk, i + dl) ∈ Ei , k 6= l. Então existe t, com
0 ≤ t ≤ dlogd N e, tal que (i + dk) − (i + dl) ≡ dt (mod cdm ), ou seja, d(k − l) ≡
dt (mod cdm ). Logo, k − l ≡ dt−1 (mod cdm−1 ), o que implica (k, l) ∈ E(C(cdm−1 , d)).
Portanto, Gi ∼
= C(cdm−1 , d).
ii) Para quaisquer i, k ∈ {0, . . . , d − 1}, i 6= j, temos Vi ∩ Vj = ∅. De fato, se
tívessemos v ∈ Vi ∩ Vj , então teríamos v = i + dk = j + dl, ou seja, i − j ≡ 0 (mod d),
o que implicaria em i = j .
Armação V (G) = ∪˙ 0≤i≤d Vi .
˙ i ⊆ G. Seja x ∈ G. Se x < d, então x ∈ Vx . Suponha que
Obviamente, ∪V
m
d ≤ x < N = cd . Então x =Sdk + r, 0 ≤ r < d, com 0 ≤ k ≤ cdm−1 − 1. Portanto,
x ∈ Vr . Além disso, E(G) = 0≤i<d Ei ∪ X , onde X = {(v, w), u, w ∈ V (G)|v ± 1 ≡
w (mod cdm )}.
De fato, se (v, w) ∈ E(G), então v −w = dt (mod cdm ), com 0 ≤ t ≤ dlogd N e−1.
Se t = 0, então v − w = 1 (mod cdm ). Logo, (v, w) ∈ X . Suponha t > 0. Assim,
v − w = dt + cdm s, s ∈ Z. Consequentemente, v − w = d(dt−1 + cdm−1 s), s ∈ Z.
Tome v, w ∈ V (G) = ∪0≤i≤d Vi . Se v, w ∈ Vi , então, como Gi é um subgrafo
induzido de G, temos (v, w) ∈ Ei e o resultado segue. Por outro lado, Se v ∈ Vi
e w ∈ Vj , com i 6= j , então v = i + dk e w = j + dl, o que implica v − w =
i − j + d(k − l) = d(dt−1 + cdm−1 . Portanto, i − j ≡ 0 (mod d), o que não é possível,
pois 0 ≤ i, j < d e i 6= j .
ϕ:
Exemplo 4.3 Considere o grafo circulante recursivo C(18, 3), onde c = 2, d = 3 e
m = 2. Seus saltos serão 30 , 31 , 32 , pois dlog3 18e − 1 = 2. Sua ilustração pode ser
vista na Figura 4.1:
Figura 4.3: Grafo circulante recursivo
C(18, 3)
4.1
O problema das árvores geradoras independentes
49
Conforme vimos, o grafo C(18, 3) pode ser particionado em três cópias de C(6, 3),
G0 (V0 , E0 ), G0 (V1 , E1 ), G2 (V2 , E2 ), nos quais os conjuntos de vértices são dados por
Vi = {j|j ≡ i (mod 3)}, onde i varia entre 0 e 2, ou seja, V0 = {0, 3, 6, 9, 12, 15}, V1 =
{1, 4, 7, 10, 13, 16} e V2 = {2, 5, 8, 11, 14, 17}. Cada um desses subgrafos está ilustrado
em uma cor na Figura 4.2.
Figura 4.4: Grafo circulante recursivo
C(18, 3)
C(cdm , d) pode ser visto como sendo um grafo de
ZN com o conjunto gerador {d0 , d1 , . . . , ddlogd N e−1 },
O grafo
po cíclico
k -ésimo
Cayley sobre o gruk
onde d é chamado
É bem conhecido que cada grafo de Cayley sobre um grupo geral
m
é vértice-simétrico e, portanto, é regular. Denotemos por δm o grau de C(cd , d).
m−1
Assim, δm−1 é o grau de cada vértice i no subgrafo C(cd
, d) e δm é o grau de cada
m
vértice j no grafo C(cd , d). Provaremos a seguir que δm = δm−1 + 2 para m ≥ 1.
m
Tome j ∈ C(cd , d). Então j ∈ Vi , para algum i ∈ {0, 1, 2, . . .}. Portanto,
j ≡ i (mod d). Note que cada j ± dt , com t ∈ {1, 2, . . . , dlogd N e − 1}, é adjacente ao
vértice
salto.
j.
Além disso,
j + dt ≡ i (mod d),
pois
dt ≡ 0 (mod d)
j±1
e
j ≡ i (mod d).
Por outro
não estão na mesma classe de equivalência que i, já que i ≡ j (mod d).
t
Portanto, j + d ∈ Vi , j − 1 ∈
/ Vi e j + 1 ∈
/ Vi . Assim sendo, o vértice j
m−1
de C(cd
, d) possui dois vértices adjacentes a menos que em C(cdm , d), o que é
lado,
suciente para mostrar a igualdade
δm = δm−1 + 2.
4.1
O problema das árvores geradoras independentes
Figura 4.5: Vértices adjacentes a
j
no grafo
50
C(cdm−1 , d)
Proposição 4.2 Para um grafo circulante recursivo C(cdm , d), δm é dado da se-
guinte forma:

2m - 1, se c = 1 e d = 2



2m,
se c = 1 e d > 2
δm =
2m + 1, se c = 2;



2m + 2, se c > 2
Dem.: Pela denição, grafos circulantes recursivos C(cdm , d) têm saltos dados pelo conjunto {d0 , d1 , d2 , . . . , ddlogd N e−1 }, onde N = cdm . Vamos considerar os
seguintes casos:
• c=1ed=2
Neste caso, dlogd N e = dlog2 2m e = dme = m, o que nos dá o conjunto de
saltos: {d0 , d1 , d2 , . . . , dm−1 }. Então os vértices adjacentes ao vértice rotulado
como x são x ± 20 , x ± 21 , x ± 22 , . . . , x ± 2m−1 . Mas os vértices x + 2m−1
e x − 2m−1 são os mesmos. De fato, as contas são tomadas módulo N que,
neste caso, é N = 2m . Observe que 2m ≡ 0 (mod 2m ) e, assim, 2 · 2m−1 ≡
0 (mod 2m ), ou seja, 2m−1 +2m−1 ≡ 0 (mod 2m ). Logo, 2m−1 ≡ −2m−1 (mod 2m )
e, consequentemente, x + 2m−1 ≡ x − 2m−1 (mod 2m ). Além disso, os vértices
x+2t e x−2t , com t < m−1, não são congruentes módulo 2m , pois, se fossem,
teríamos 2t ≡ −2t (mod 2m ), ou ainda, 2·2t ≡ 0 (mod 2m ), o que não é verdade,
já que 21+t < 2m . De forma análoga, a igualdade entre elementos x+2t e x+2q ,
com t < q , também não seria possível, pois como 0 < 2t − 2q < 2m , então
2t − 2q não é congruente a 0 módulo 2m e, assim, não pode ocorrer x + 2t ≡
x + 2q (mod 2m ). O mesmo raciocínio é válido para as demais comparações
entre x ± 2t e x ± 2q , com q 6= t. Portanto, existem 2m − 1 vértices adjacentes
a cada vértice x do grafo, ou seja, δm = 2m − 1.
• c=1 e d>2
Nessas condições, o conjunto de saltos é dado por {d0 , d1 , d2 , . . . , dm−1 }, pois
dlogd N e = dlogd dm e = dme = m. Considerando que d > 0, dado um vértice x,
os seguintes vértices são adjacentes a ele: x ± d0 , x ± d1 , x ± d2 , . . . , x ± dm−1 .
Neste caso, os vértices x+dt e x−dt , com 0 ≤ t ≤ m−1 são distintos, pois caso
4.1
O problema das árvores geradoras independentes
51
ocorresse x + dt ≡ x − dt (mod dm ), então teríamos 2 · dt ≡ 0 (mod dm ), o que
não é verdade já que 0 < 2 · dt < d · dm−1 = dm (estamos considerando d > 2).
De forma análoga, a igualdade entre elementos x + dt e x + dq , com t < q ,
também não seria possível, pois como 0 < dt − dq < dm , então dt − dq não é
congruente a 0 módulo dm e, assim, não pode ocorrer x + dt ≡ x + dq (mod dm ).
O mesmo raciocínio é válido para as demais comparações entre x ± dt e x ± dq ,
com q 6= t. Portanto, existem 2m vértices adjacentes a cada vértice x do grafo,
ou seja, δm = 2m.
• c=2
Neste caso, dlogd N e = dlogd 2 · dm e = dlogd 2 + logd dm e = dlogd 2 + me = m + 1,
pois 0 < logd 2 < 1. Isto nos dá o conjunto de saltos: {d0 , d1 , d2 , . . . , dm }.
Então os vértices adjacentes ao vértice rotulado como x são x ± d0 , x ± d1 , x ±
d2 , . . . , x ± dm . Mas os vértices x + dm e x − dm são os mesmos. De fato,
as contas são tomadas módulo N que, neste caso, é N = 2 · dm . Observe
que 2 · dm ≡ 0 (mod 2 · dm ) e, assim, dm + dm ≡ 0 (mod 2 · dm ), ou seja,
dm ≡ −dm (mod 2 · dm ). Logo, x + dm ≡ x − dm (mod 2 · dm ). Além disso, os
vértices x + dt e x − dt , com t < m, não são congruentes módulo 2 · dm , pois,
se fossem, teríamos dt ≡ −dt (mod 2 · dm ), ou ainda, 2 · 2t ≡ 0 (mod 2 · dm ), o
que não é verdade já que 2 · dt = 21+t < 2 · dm . De forma análoga, a igualdade
entre elementos x + dt e x + dq , com t < q , também não seria possível, pois
como 0 < dt − dq < 2dm , então dt − dq não é congruente a 0 módulo 2 · dm e,
assim, não pode ocorrer x + dt ≡ x + dq (mod 2 · dm ). O mesmo raciocínio é
válido para as demais comparações entre x ± dt e x ± dq , com q 6= t. Portanto,
existem 2(m + 1) − 1 = 2m + 1 vértices adjacentes a cada vértice x do grafo,
ou seja, δm = 2m + 1.
• c>2
Nesta última condição, temos dlogd N e = dlogd c · dm e = dlogd c + logd dm e =
dlogd c + me = m + 1, pois, como c < d, então 0 < logd c < 1. Isto nos dá
o conjunto de saltos: {d0 , d1 , d2 , . . . , dm+1 }. Então os vértices adjacentes ao
vértice rotulado como x são x ± d0 , x ± d1 , x ± d2 , . . . , x ± dm+1 . Neste caso,
os vértices x + dt e x − dt , com 0 ≤ t ≤ m + 1 não são os mesmos. De fato,
as contas são tomadas módulo N que, neste caso, é N = c · dm . Observe que
se os vértices fossem iguais, teríamos x + dt ≡ x − dt (mod c · dm ), ou seja,
2 · dt ≡ 0 (mod c · dm ), o que não é verdade pois 0 < 2 · dt < c · dm . De forma
análoga, a igualdade entre elementos x + dt e x + dq , com t < q , também não
seria possível, pois como 0 < dt − dq < c · dm , então dt − dq não é congruente
a 0 módulo c · dm e, assim, não pode ocorrer x + dt ≡ x + dq (mod c · dm ). O
mesmo raciocínio é válido para as demais comparações entre x ± dt e x ± dq ,
com q 6= t. Portanto, existem 2(m + 1) = 2m + 2 vértices adjacentes a cada
vértice x do grafo, ou seja, δm = 2m + 2.
A vizinhança de um vértice
vértices adjacentes a
x
x,
denotada por
N (x),
é o conjunto de todos os
em um grafo. Como RC-Grafos são vértice-simétricos, sem
perda de generalidade, podemos simplesmente considerar o vértice 0 como raiz da
m
k
IST para C(cd , d). Obviamente, N (0) = {±d : 0 ≤ k ≤ dlogd N e − 1}.
4.1
O problema das árvores geradoras independentes
Seja
= = {T1 , T2 , . . . , Tn }
52
um conjunto constituído por n árvores geradoras inC(cdm , d). Veremos mais tarde que n = δm .
dependentes enraizadas em 0 no grafo
T ∈ =, o pai de um vértice x(6= 0), denotado por pai(T, x), é um vérm
tice adjacente a x no caminho T [x, 0]. Da conectividade de C(cd , d) e do fato de
|=| = δm , existe apenas um lho de 0 em cada árvore geradora T ∈ =. Assim,
k
k
k
se x = +d (respectivamente, x = −d ), então ele usa o salto j = −d (respectik
k
vamente, j = +d ) para conectar à raiz. Além disso, j = −d (respectivamente,
j = +dk ) é o último salto em um caminho ligando cada vértice e a raiz. Por isso,
−
+
denotamos por Tk (respectivamente, Tk ) para especicar a IST cuja raiz possui
k
k
+d (respectivamente,−d ) como seu lho. Por exemplo, quatro IST's enraizadas
em 0 no grafo C(16, 4) são mostradas na Figura 4.4.
Para cada
Figura 4.6: Árvores Geradoras Independentes no grafo
C(16, 4)
+dk
Para representar explicitamente a adjacência, usamos a notação x → y se x +
−dk
dk = y (respectivamente, x → y se x − dk = y ) para signicar que ambos os vértices
x, y ∈ C(cdm , d) são conectados pelo k -ésimo salto. Assim, podemos representar um
caminho usando esta notação repetidamente.
k
Seja J = {±d : 0 ≤ k ≤ dlogd N e − 1}. Se um salto j ∈ J ocorre sucessivamente
j
para conectar x e y , então usamos a notação x ⇒α y para dizer que y = x + α · j ,
m
onde α é o número de repetições de j entre x e y . Seja x(6= 0) ∈ C(cd , d) qualquer
j1−1
j1
j2
j3
jl
vértice e suponha que x0 → x1 → x2 → · · · → xl−1 → xl é um caminho mais
curto que liga
x(= x0 )
e
0(= xl ),
onde cada
ji ∈ J
é um salto. Por uma questão de
caminho
mais curto
P
de x e é denotado por Px .
l
Como x pode ser decomposto na soma
i=1 (−ji ), dizemos que uma decomposição
de x é a sua representação de seus termos pelos seus saltos. Para j ∈ J , denotamos
conveniência, tal caminho é chamado
por
n(Px , j)
o número de ocorrências de
j
em
Px .
Proposição 4.3 Para Px , um caminho mais curto entre x e 0, são válidas as se-
guintes condições:
(i) xi 6= xk para 0 ≤ i, k ≤ l e i 6= k ;
(ii) ji 6= −jk para 1 ≤ i, k ≤ l e i 6= k
(iii) n(Pk , j) ≤ b d2 c para todo j ∈ J .
Dem.:
(i) Se existissem i, k diferentes, digamos i < k , tais que 0 ≤ i, k ≤ l e xi = xk ,
jk−1
jk+1
ji+1
j1−1
j
j
j
j
então Px seria dado por: x0 →1 x1 →2 x2 →3 · · · xi →
· · · → xk → · · · → xl−1 →l
4.1
O problema das árvores geradoras independentes
53
xl . Entretanto, o caminho seguinte também liga x0 a xl , mas possui menos saltos:
jk+1
j1−1
j
j1
j2
j3
x0 → x1 → x2 → · · · xi → · · · → xl−1 →l xl . Portanto, o primeiro caminho não é
o mais curto.
(ii) Suponha que existam i, k diferentes, digamos i < k , tais que 0 ≤ i, k ≤ l e
ji = −jk , então o caminho Px possuiria um
Removendo ji e
Pl número s de
Psaltos.
l
−jk , obteríamos o mesmo caminho já que n=1 (−jn ) =
n=1, (−jn ), mas esse
n6=i,n6=−j
último possui dois saltos a menos e, portanto, é mais curto que Px , o que gera uma
contradição com a hipótese.
(iii) Suponha que exista j = dk em J tal que n(Pk , j) > b d2 c. Então temos em
Px o termo dk (b d2 c + p), com p > 0. Vejamos os dois casos:
d par: Neste caso, o termo que aparece é dk (b d2 c+p), com 0 < p < b d2 c. Se p ≥ d2 ,
então b d2 c+p = d+p0 , sendo d0 < d2 . Se d0 ≥ d2 , repita o raciocínio. Agora observe que
k+1
k+1
k+1
k
dk (b d2 c+p) = dk ( d2 +p) = d 2 +pdk + d 2 − d 2 = dk+1 +pdk − dd2 = dk+1 +(p− d2 )dk .
Resta mostrarmos que |p − d2 | < d2 ,ou seja, que − d2 < p − d2 < d2 . Mas isso é válido,
pois, como p > 0, temos − d2 < p − d2 e, além disso, temos p − d2 < 0 < d2 .
d ímpar: Neste caso, o termo que aparece também é dk (b d2 c+p), mas com 0 < p <
d
b 2 c = d−1
. Se p ≥ d+1
, então b d2 c + p = d + p0 , com p0 < d2 . Se p0 ≥ d+1
, repita o ra2
2
2
k−1
k
k+1
k+1
d
d−1
d
d
ciocínio. Agora observe que dk (b 2 c+p) = dk ( 2 +p) = 2 − 2 +pdk + d 2 − d 2 =
)dk . Resta mostrarmos que |p − d+1
| ≤ d−1
,ou
dk+1 + (p − 12 − d2 )dk = dk+1 + (p − d+1
2
2
2
d+1
d−1
d+1
d−1
d−1
seja, que − 2 ≤ p − 2 < 2 . Mas isso é válido, pois p − 2 < 0 < 2 e, como
p ≥ 1, temos − d2 ≤ d2 + p − 1. Logo, − d2 + 21 ≤ d2 − 12 + p.
Um
quadrado latino
de um conjunto
H
de
é uma matriz quadrada com
n
n2
entradas escolhidas a partir
elementos distintos de tal forma que nenhum dos elemen-
tos ocorre duas vezes em qualquer linha ou coluna da matriz. Um
para um caminho de decomposição
Px é um quadrado latino
HPx = {j ∈ J : n(Px , j) 6= 0}.
to
quadrado latino
(PDLS) com relação a um caminho mais cur-
cujas entradas são escolhidas a partir do conjunto
Em particular, denimos a seguinte matriz.
Denição 4.2 Seja HPx = {j0 , j1 , . . . , jt−1 } com |j0 | < |j1 | < · · ·|jt−1 |. Então a
matriz denida
 abaixo é chamada
j0
j1
 j1
j2

 ..
I(Px ) =  .

 jt−2 jt−1
jt−1 j0
···
···
···
···
···
PDLS rotacional

jt−2 jt−1
jt−1 j0 




jt−4 jt−3 
jt−3 jt−2
crescente
de Px :
A entrada ji+1 é chamada a sucessora de ji e é denotada por succ(I(Px ), ji ),
onde os índices i e i + 1 são tomados módulo t. (Daqui por diante, todas as contas
aplicadas aos índices das entradas em PDLS são tomadas módulo |HPx |.)
4.1
O problema das árvores geradoras independentes
Denição 4.3 Para um caminho mais curto Px , seja r =
54
n(Px , j). Um
PDLS de Px com repetições, denotado por I (Px ), é uma matriz de tamanho t × r
obtida a partir de I(Px ) tal que cada entrada j em uma linha de I(Px ) é substituída
por n(Px , j) repetições de j na mesma linha de I ∗ (Px ).
∗
Como cada linha de
I(Px )
P
j∈HPx
pode ser vista como uma sequência de inteiros, tam-
bém denimos as seguintes sequências.
Denição 4.4 Para um caminho mais curto Px , uma sequência regular R de Px ,
denotada por R = [Px ], é uma sequência de inteiros escolhidos a partir de um linha
de I ∗ (Px ). Em particular, denotamos por R = [Px ]j uma sequência regular R que
contém um salto especíco j ∈ HPx como seu último elemento. Além disso, uma
sequência de inteiros S é chamada uma sequência estendida de Px , denotada por
S = (α · j 0 )|[Px ], se S é obtida a partir de R = [Px ] adicionando α repetições de um
salto j 0 ∈ J antes dos termos da sequência R.
Denição 4.5 Seja A = a1 , a2 , . . . , at uma sequência
de números inteiros. Uma
P
de A é denida como uma soma ki=1 ai para algum k = 1, 2, . . . , t.
Em particular, uma soma-prexo
P restrita é uma soma-prexo que satisfaz k 6= t.
Além disso, denimos FA = { ki=1 ai : k = 1, 2, . . . , t − 1}, como o conjunto que
contém todas as somas-prexo estritas de A.
soma-prexo
Proposição 4.4 Para um caminho mais curto Px , se R e R0 são duas sequências
regulares distintas de Px , então FR ∩ FR0 = ∅.
Dem.: Considere o conjunto HPx = {j0 , j1 , . . . , jt−1 } com |j0 | < |j1 | < · · · <
|jt−1 |. Tome s1 ∈ FR e s2 ∈ FR0 duas somas-prexo estritas quaisquer das sequências
R e R0 , respectivamente. Então, conforme a denição de soma prexo estrita, pelo
menos um salto jk ∈ HPx aparece na decomposição de s1 − s2 ou
de s2 − s1 . Como
Pk−1
d
n(Px , jk−1 ) · |jk−1 | ≤ b 2 c · |jk−1 | < |jk | para todo 1 ≤ k < t − 1 e i=0 n(Px , ji ) · |ji | <
|jk |, o salto jk não pode ser soma de outros saltos em qualquer sequência regular
de Px , exceto ele mesmo. Dessa forma, ocorre ±(s1 − s2 ) 6= 0, ou seja, temos a
desigualdade s1 6= s2 .
Para demonstrar mais propriedades relacionadas com PDLS com relação a um
caminho mais curto a
Px ,
também denimos
HPx = {j ∈ J : −j ∈ HPx }.
Proposição 4.5 Sejam x, y(6= 0) ∈ C(cdm , d) dois vértices tais que y = x + α · j
para algum salto j ∈ HPx ∩ HPy , onde 1 ≤ α ≤ d − n(Px , −j) − n(Py , j). Se R = [Px ]
e R0 = (α · j)|[Py ]j , então FR ∩ FR0 = ∅.
4.1
O problema das árvores geradoras independentes
Dem.:
55
j
x ⇒α y juntamente com Py e Px , são dois caminhos que ligam x e
m
0 em C(cd , d). Sejam s1 ∈ FR e s2 ∈ FR0 duas somas-prexo estritas quais/ HPx e
quer de R e R0 , respectivamente. Como j ∈ HPx , isto implica que j ∈
n(Px , −j) > 0. Assim, a decomposição de s1 não inclui o termo j . Por outro lado,
uma vez que j ∈ HPy , isso implica que −j ∈
/ HPy e n(Py , j) > 0. Assim, a decomposição de s2 não inclui o termo −j . Como j é o primeiro elemento em R0 e
α + n(Py , j) ≤ d − n(Px , −j) < d, a decomposição de s2 sempre contém o termo j .
Além disso, como α + n(Px , −j) ≤ d − n(Py , j) < d, o termo n(Px , −j) não pode ser
o complemento de α sob a base de d. Assim, s1 6= s2 .
Proposição 4.6 Sejam x, y(6= 0) ∈ C(cdm , d) dois vértices tais que y = x − j pa-
ra algum salto j ∈ HPy − (HPx ∪ HPx ). Se R = [Px ] e R0 = (−j)|[Py ]j , então
FR ∩ FR0 = ∅.
−j
Dem.: x →
y juntamente com Py e Px são dois caminhos que ligam os vértices
x e 0 em C(cdm , d). Tome s1 ∈ FR e s2 ∈ FR0 duas somas-prexo estritas quaisquer
/ HPx e
de R e R0 , respectivamente. Como j ∈
/ HPx ∪ HPx , isto implica que j ∈
−j ∈
/ HPx . Assim, a decomposição de −(x + s1 ) não inclui os termos j e −j . Por
outro lado, uma vez que Py contém j como um salto, isto implica que −j ∈
/ HPy .
0
Além disso, como j é o último elemento em R , a decomposição de −(x + s2 ) sempre
contém o termo j . Portanto, −(x+s1 ) 6= −(x+s2 ), e isto implica ainda que s1 6= s2 .
Proposição 4.7 Sejam x, y, z(6= 0) ∈ C(cdm , d) tais que y = x + α · j e z =
x + β · j 0 são dois vértices distintos para saltos j ∈ HPy ∩ HPz e j 0 ∈ HPz , onde
1 ≤ α ≤ d − n(Pz , −j) − n(Py , j) e β ≥ 1. Se R = (α · j)|[Py ]j e R0 = (β · j 0 )|[Pz ]j 0 ,
então FR ∩ FR0 = ∅.
j
j0
Dem.: x ⇒
α y junto com Py e x ⇒β z junto com Pz são dois caminhos que
conectam x e 0 em C(cdm , d). Sejam s1 ∈ FR e s2 ∈ FR0 somas-prexo estritas
quaisquer de R e R0 , respectivamente. Como j ∈ HPz , isto implica que j ∈
/ HPz
e n(Pz , −j) > 0. Portanto, a decomposição de s2 não inclui o termo j . Como
j 0 ∈ HPz , temos j 6= j 0 . Por outro lado, como j ∈ HPy , isto implica que n(Py , j) > 0
e a decomposição de s1 não inclui o termo −j . Como j é o primeiro elemento em
R e α + n(Py , j) ≤ d − n(Pz , −j) < d, a decomposição de s1 sempre contém o termo
j . Mais ainda, como α + n(Pz , −j) ≤ d − n(Py , j) < d, o termo n(Pz , −j) não pode
ser o complemento de α sob a base d. Portanto, s1 6= s2 .
4.2
O problema das árvores geradoras independentes
56
Proposição 4.8 Sejam x, y, z(6= 0) ∈ C(cdm , d) tais que y = x − j e z = x − j 0 são
dois vértices distintos para saltos j ∈ HPy − (HPz ∪ HPz ) e j 0 ∈ HPz − (HPy ∪ HPy ).
Se R = (−j)|[Py ]j e R0 = (−j 0 )|[Pz ]j 0 , então FR ∩ FR0 = ∅.
−j
j0
Dem.: x →
y junto com Py e x → z junto com Pz são dois caminhos que conectam x e 0 em C(cdm , d) e j 6= j 0 . Sejam s1 ∈ =R e s2 ∈ =R0 duas somas-prexo
/ HPy ∪ HPy , a decomposição
de R e R0 , respectivamente. Como j ∈
/ HPz ∪ HPz e j ∈
de −(x + s2 ) (respectivamente, −(x + s1 )) não inclui os termos j e −j (respectivamente, j 0 e −j 0 ). Por outro lado, como R contém j como seu último elemento, a
decomposição de −(x + s1 ) sempre contém o termo j . De forma análoga, como R0
contém j 0 como seu último elemento, a decomposição de −(x + s2 ) sempre contém
o termo j 0 . Portanto, −(x + s1 ) 6= −(x + s2 ) e, consequentemente, s1 6= s2 .
Proposição 4.9 Sejam x, y, z(6= 0) ∈ C(cdm , d) tais que y = x + α · j e z = x − j 0
são dois vértices distintos para saltos j ∈ HPy ∩ HPz e j 0 ∈ HPz , onde 1 ≤ α ≤
d − n(Pz , −j) − n(Py , j). Se R = (α · j)|[Py ]j e R = (−j 0 )|[Pz ]j 0 , então FR ∩ FR0 = ∅
−j 0
a
Dem.: x ⇒
b y junto com Py e x → z junto com Pz são dois caminhos que ligam
x e 0 em C(cdm , d) e j 6= j 0 . Sejam s1 ∈ FR e s2 ∈ FR0 duas somas-prexo estritas
quaisquer de R e R0 , respectivamente. De um argumento similar ao da Proposição
4.5, mudando Px por Pz , podemos mostrar que s1 6= s2 .
4.2
Construindo IST's em
C(cdm, d)
com
d>2
Nesta seção, apresentamos um algoritmo de Yanga (2009) para resolver o problema de encontrar árvores geradoras independentes (IST's) em RC-grafos com d > 2.
m
Seja x um vértice qualquer em C(cd , d) e suponha que x = (xm xm−1 · · · x1 x0 )d é rem
m−1
presentado como um inteiro com base d. Então x = xm d +xm−1 d
+· · ·+x1 d+x0 :
Note que
0 ≤ xi < d
para
i = 0, 1, . . . , m − 1
Shortest-Path
e
0 ≤ xm < c .
O seguinte procedi-
Px
x e 0). Como uma substituição para
listar os vértices de Px , estabelecemos o conjunto HPx . Para simplicar as notações
no algoritmo, escrevemos H no lugar de HPx , e n(j) no lugar de n(Px , j) para cada
salto j ∈ J .
mento chamado
será usado para encontrar o caminho mais curto
(isto é, um caminho mais curto entre os vértices
Procedimento Shortest-Path(x)
begin
1.
2.
3.
H = ∅; Carry = 0;
For i = 0 to m − 1 do
if 0 < xi ≤ bd/2c
4.2
O problema das árvores geradoras independentes
4.
5.
else
6.
7.
8.
else
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
57
H = H ∪ {−di }; n(−di ) = xi ; n(+di ) = 0;
Carry = 0;
if bd/2c < xi ≤ d − 1
H = H ∪ {+di }; n(+di ) = d − xi ; n(−di ) = 0;
xi+1 = xi+1 + 1; Carry = 1;
n(−di ) = n(+di ) = 0;
if Carry = 1
xi+1 = xi+1 + 1;
endif
enddo
if c ≥ 2 and 0 < xm ≤ bc/2c
else
else
H = H ∪ {−dm }; n(−dm ) = xm ; n(+dm ) = 0;
if c > 2 and bc/2c < xm ≤ c − 1
H = H ∪ {+dm }; n(+dm ) = c − xm ; n(−dm ) = 0;
20.
n(−dm ) = n(+dm ) = 0;
endif
end Shortest-Path
21.
Como resultado, um caminho mais curto
em cada linha na matriz
∗
I (Px ).
Px
Por exemplo,
pode ser descrito usando os saltos
−50
−50
+52
+52
P = (327 → 326 → 325 → 350 →
+53
3
é um caminho mais curto de 327 = (2302)5 em C(4 × 5 , 5).
m
Para cada vértice x(6= 0) ∈ C(cd , d), de acordo com o caminho mais curto
375 → 0)
denimos
Px ,
{j ∈ J − {±dm } : −j ∈ HPx } se c = 2
(1)
se c 6= 2
{j ∈ J : −j ∈ HPx }
Para cada i ∈ {0, 1, . . . , δ − 1}, denimos λ(i) = min{i, δm − 1 − i} e seja
− se i ≤ λ(i)
sign(i) =
+ se i > λ(i)
Usando um conjunto de regras referentes a HPx e HP , podemos determinar o
x
pai de x em cada árvore geradora T ∈ =, onde = é o conjunto de todas as IST's
m
construídas pelo algoritmo. Para cada vértice x(6= 0) ∈ C(cd , d), realizamos o
HPx =
seguinte procedimento:
Procedimento:
begin
Gen-Parents(x)
HPx , HPx e J − (HPx ∪ HPx ) para x;
for i = 0 to δm − 1 do
j = sign(i) × dλ(i) ; 
 x + succ(I(Px ), j) se j ∈ HPx ;
sign(i)
x+j
se j ∈ HP ;
parent(Tλ(i) , x) =
x

x−j
caso contrário
1. Determine
2.
3.
4.
5.
enddo
end Gen-Parents
(2)
4.2
O problema das árvores geradoras independentes
58
Através do Algoritmo Gen-Parents, podemos determinar os pais de cada vértice,
em todas as árvore geradoras independentes. A partir dessas informações, é possível
desenhar todas as
δm
árvores do conjunto
=.
Exemplo 4.4 Retornando ao grafo do Exemplo 4.3 e utilizando o Algoritmo GenParentes, que apresentamos nessa seção, podemos obter todas as árvores geradoras
independentes de C(2 × 32 , 3).
Figura 4.7: Árvore
T0−
do grafo
C(18, 3)
Figura 4.8: Árvore
T0+
do grafo
C(18, 3)
4.3
O problema das árvores geradoras independentes
Figura 4.9: Árvore
T1−
do grafo
C(18, 3)
Figura 4.10: Árvore
T1+
do grafo
C(18, 3)
Figura 4.11: Árvore
T2−
do grafo
C(18, 3)
59
4.3
O problema das árvores geradoras independentes
4.3
60
Prova da vericidade do algoritmo
Nesta seção, provamos resultados que demonstram a veracidade do Algoritmo
sign(i)
. Por conveniência, denotamos por Ti o grafo Tλ(i)
e vamos considerar
λ(i)
= sign(i) × d . Os Lemas 4.1 e 4.2 mostram que se j ∈
/ HPx , então existe um
Gen Parents
j
vértice
y
no caminho
Ti [x, 0]
de forma que temos
j ∈ HPy .
Lema 4.1 Seja x(6= 0) um vértice qualquer em C(cdm , d) e j = sign(i)×dλ(i) ∈ HPx
para algum 0 ≤ i ≤ δm −1. Se λ(i) 6= m ou c > 2 , então existe um vértice y = x+α·j
tal que j∈ HPy onde
d − n(Px , −j) − n(Py , j) se λ(i) 6= m
α=
c − n(Px , −j) − n(Py , j) caso contrário
Dem.: Suponha x = (xm xm−1 · · · x1 x0 )d e seja HPx = {j0 , j1 , · · · , jt−1 } com
|j0 | < |j1 | < · · · < |jt−1 | . Se c = 1, ±dm ∈
/ J , pois J = {±dk , 0 ≤ k ≤ dlogd 1 ×
dm e − 1} e, por (1), dm ∈
/ HPx se c = 2. Em particular, se dm ∈ HPx , então c > 2.
Como j ∈ HPx , assumimos que j = −jp para algum p com 0 ≤ p ≤ t − 1 . Vamos
agora considerar os dois casos seguintes (para λ(i) = m, consideramos d como c na
prova):
Caso 1: i ≤ λ(i). Neste caso, j < 0 e −j = jp = di ∈ Px . De fato, n(Px , −j) =
n(Px , di ) = d − xi onde b d2 c < xi ≤ d − 1. Sejam α = xi − b d2 c e y = x +
α · j , que é representado por (ym ym−1 · · · y1 y0 )d . Então yk = xk para cada k ∈
{0, 1, . . . , i − 1, i + 1, i + 2, . . . , m} e yi = b d2 c. Aplicando o Procedimento ShortestPath a y , obtemos n(Py , j) = n(Py , −di ) = b d2 c > 0, e então j ∈ HPy . Portanto,
α + n(Px , −j) + n(Py , j) = (xi − b d2 c) + (d − xi ) + b d2 c = d.
0
Caso 2: i > λ(i). Neste caso, j > 0 e −j = jp = −di ∈ Px onde i0 = δm − 1 − i.
0
De fato, n(Px , −j) = n(Px , −di ) = xi0 onde 0 < xi0 ≤ b d2 c. Sejam α = b d2 c + 1 − xi0
e y = x + α · j que é representada por (ym ym−1 · · · y1 y0 )d . Então yk = xk para cada
k ∈ {0, 1, . . . , i0 +1, i0 +2, . . . , m} e yi0 = b d2 c+1. Aplicando o Procedimento Shortest0
Path para y , obtemos n(Py , j) = n(Py , di ) = d − (b d2 c + 1) > 0 e então j ∈ HPy .
Dessa forma, α + n(Px , −j) + n(Py , j) = (b d2 c + 1 − xi0 ) + xi0 + (d − b d2 c − 1) = d.
Lema 4.2 Seja x(6= 0) um vértice qualquer em C(cdm , d). Se j = sign(i) × dλ(i) ∈/
(HPx ∪ HPx ) para algum 0 ≤ i ≤ δ − 1, então existe um vértice y = x − j (isto é,
y = pai(Ti , x)) tal que j ∈ HPy . Em particular, HPy = HPx ∪ {j}.
Dem.: Por (2), se j ∈ J − (HPx ∪ HPx ), então y = x − j . Como j ∈/ HPx e
j∈
/ HPx , o conjunto HPx não contém os saltos j e −j . Obviamente, HPy = HPx ∪{j}
e, portanto, j ∈ HPy .
4.3
O problema das árvores geradoras independentes
Por questão de conveniência, usaremos
quando
λ(i) = m
e
c > 2.
d
no lugar de
61
c
deste ponto em diante
Os lemas 4.3 e 4.4 nos auxiliarão para mostrar a inde-
pendência de dois caminhos.
Lema 4.3 Seja x(6= 0) um vértice qualquer em C(cdm , d) e suponha que j, j 0 ∈ HPx ,
onde j = sign(i) × dλ(i) e j 0 = sign(i0 ) × dλ(i ) , com 0 ≤ i, i0 ≤ δm − 1 e i 6= i0 . Se
y = x + α · j e z = x + β · j 0 são dois vértices em C(cdm , d) e |j| < |j 0 |, então j ∈ HPz
e α + n(Pz , −j) + n(Py , j) = d.
Dem.: Seja HPx = {j0 , j1 , . . . , jt−1 } com |j0 | < |j1 | < · · · < |jt−1 |. Como
j, j 0 ∈ HPx e |j| < |j 0 |, assumimos que j = −jp e j 0 = −jq sendo 0 ≤ p < q ≤ t − 1.
Pelo Lema 4.1, precisamos apenas considerar λ(i0 ) 6= m ou c > 2. Além disso, j ∈ HPy e α = d − n(Px , −j) − n(Py , j). Também temos j 0 ∈ HPz e β =
d − n(Px , −j 0 ) − n(Pz , j 0 ). Como y = x + (d − n(Px , −j) − n(Py , j)) · j , temos HPy =
{j0 , j1 , . . . , jp−1 , j, . . . , j|HPy |−1 }, onde n(Py , jk ) = n(Px , jk ) para todo 0 ≤ k ≤ p − 1,
e o número de repetições de j em Py é ou b d2 c ou d − b d2 c − 1 que é determinado por
i ≤ λ(i) ou i > λ(i). De forma análoga, como z = x + (d − n(Px , −j 0 ) − n(Pz , j 0 )) · j 0 ,
temos HPz = {j0 , j1 , . . . , jq−1 , j 0 , . . . , j|HPz |−1 }, onde n(Pz , jk ) = n(Px , jk ) para todo
0 ≤ k ≤ q−1 e o número de repetições de j 0 em Pz é ou b d2 c ou d−b d2 c−1 que é determinado por i0 ≤ λ(i0 ) ou i0 > λ(i0 ). De HPy e HPz bem como p < q , podemos ver que
existe um salto jr ∈ HPz tal que jr = jp = −j , onde 0 ≤ r ≤ q − 1. Como um resultado, −j ∈ HPz se, e somente se, j ∈ HPz , Além disso, α + n(Pz , −j) + n(Py , j) = d
segue do fato que n(Pz , −j) = n(Px , −j).
0
Lema 4.4 Seja x(6= 0) um vértice qualquer
em C(cdm , d) e suponha que j = sign(i)×
0
dλ(i) ∈ HPx e j 0 = sign(i0 ) × dλ(i ) ∈
/ (HPx ∪ HPx ) onde 0 ≤ i, i0 ≤ δm − 1.
Se y = x + α · j e z = x − j 0 são dois vértices em C(cdm , d), então j ∈ HPz e
α + n(Pz , −j) + n(Py , j) = d.
Dem.: Como j ∈ HPx e j 0 ∈/ HPx , j 6= j 0 . Seja HPx = {j0 , j1 , . . . , jt−1 } com
|j0 | < |j1 | < · · · < |jt−1 |. Como j ∈ HPx , assumimos que j = −jp para algum
0 ≤ p ≤ t−1. Pelo Lema 4.1, j ∈ HPy e α = d−n(Px , −j)−n(Py , j). Por outro lado,
como j 0 ∈
/ HPx ∪ HPx , o Lema 4.2 mostra que HPz = HPx ∪ {j 0 }, e isto implica ainda
que n(Pz , jk ) = n(Px , jk ) para todo salto jk ∈ HPz − {j 0 }. Portanto, −j = jp ∈ HPx
implica que −j ∈ HPz e j ∈ HPz . Além disso, α + n(Pz , −j) + n(Py , j) = d segue
do fato que n(Pz , −j) = n(Px , −j).
O lema seguinte mostra que todo subgrafo construído em
árvore geradora.
=
é, de fato, uma
4.3
O problema das árvores geradoras independentes
62
Lema 4.5 Para todo inteiro i com 0 ≤ i ≤ δm − 1, Ti é uma árvore geradora
enraizada em 0 no grafo C(cdm , d).
Dem.: Seja j = sign(i) × dλ(i) . É direto do Procedimento Gen-Parents que
para todo vértice x(6= 0) ∈ C(cdm , d) tem-se x ∈ Ti . Portanto, o grafo resultante
é um subgrafo gerador de C(cdm , d). Para completar a prova, precisamos mostrar
que existe um único caminho de todo vértice x(6= 0) a 0 em Ti , pois isso garante
que a árvore não possui ciclo. Em particular, o vértice −j é adjacente a 0 em Ti .
Suponha que HPx = {j0 , j1 , . . . , js−1 } com |j0 | < |j1 | < · · · < |js−1 |. Então cada
n(Px , jk ), k = 0, 1, . . . , s − 1, no caminho mais curto Px , pode ser calculado pelo
Procedimento Shortest-Path. De acordo com j , podemos considerar os seguintes
casos:
Caso 1: j ∈ HPx . Suponha que j = jp para algum p = 0, 1, . . . , s − 1. Como
jp+1 = succ(I(Px ), jp ), x é adjacente a x + jp+1 em Ti pelo passo 4 do procedimento
Gen-Parents(x). Seja y = x + n(Px , jp+1 ) · jp+1 . Então Py é um subcaminho de
Px e HPy = {j0 , j1 , . . . , jp , jp+2 , . . . , js−1 }. Portanto, n(Py , jk ) = n(Px , jk ) para todo
jk ∈ HPy . Como jp ∈ HPy e jp+2 = succ(I(Py ), jp ), y é adjacente a y + jp+2 em
Ti pelo passo 4 do procedimento Gen-Parents(x). Seja z = y + n(Py , jp+2 ) · jp+2 .
Então Pz é um subcaminho de Py e HPz = {j0 , j1 , . . . , jp , jp+3 , . . . , js−1 }. Portanto, n(Pz , jk ) = n(Py , jk ) para todo jk ∈ HPz . Novamente, pelo passo 4 de GenParents(x), z é adjacente a z + jp+3 em Ti . Desta forma, podemos encontrar o
seguinte caminho único que liga x a 0 em Ti :
jp+1
jp+2
Ti [x, 0] : x ⇒ n(Px ,jp+1 ) (x + n(Px , jp+1 ) · jp+1 ) ⇒ n(Px ,jp+2 ) (x + n(Px , jp+1 ) · jp+1 +
jp+3
jp−1
jp
n(Px , jp+2 ) · jp+2 ) ⇒ n(Px ,jp+3 ) · · · ⇒ n(Px ,jp−1 ) (−n(Px , jp ) · jp ) ⇒n(Px ,jp ) 0.
Caso 2: j ∈ HPx . Pelo passo 4 de Gen-Parents(x) , x é adjacente a x + j em
Ti . Por (1), se c = 2, então j 6= ±dm e isso implica ainda que λ(i) 6= m. Caso
contrário, decorre de Shortest=Path que ou c > 2 ou c = 1 e λ(i) 6= m. Assim, pelo
Lema 4.1, existe um vértice y = x + α · j , onde α = d − n(Px , −j) − n(Py , j) tal que
j ∈ HPy . Além disso, demonstramos no caso 1 que existe um único caminho Ti [y, 0]
j
que liga y e 0 em Ti . Portanto, x ⇒α y junto com o caminho Ti [y, 0] forma o único
caminho de ligação entre x e 0 em Ti .
Caso 3:. j ∈ J − (HPx ∪ HPx ). Pelo passo 4 de Gen-Parents(x), x é adjacente a
x − j em Ti . Seja y − j . Pelo Lema 4.2, j ∈ HPy . Além disso, mostramos no caso
−j
1 que existe um caminho único Ti [y, 0] que liga y e 0 em Ti . Portanto, x → y junto
com o caminho Ti [y, 0] forma o único caminho de ligação entre x e 0 em Ti .
Vamos agora mostrar a independência das IST's no conjunto de árvores
=
que
construímos no algoritmo.
Lema 4.6 Para 0 ≤ i, i0 ≤ δm − 1 e i 6= i0 , Ti e Ti0 são IST enraizadas em 0 no
grafo C(cdm , d).
Dem.: Sejam 0x(6= 0) um vértice qualquer de C(cdm , d), j = sign(i) × dλ(i) e
0
j = sign(i0 ) × dλ(i ) . Consideremos os seguintes casos:
4.3
O problema das árvores geradoras independentes
63
Caso 1: j, j 0 ∈ HPx . Segue da Proposição 4.4 que Ti [x, 0]||Ti0 [x, 0].
Caso 2: j ∈ HPx e j 0 ∈ HPx . Pelo Lema 4.5, Ti [x, 0] tem j como seu último salto
j0
e existe um vértice y = x + α · j 0 tal que x ⇒α y junto com o caminho Ti0 [y, 0] forma
o único caminho de ligação entre x e 0 em Ti0 . Em particular, Ti [y, 0] possui j 0 como
seu último salto. Pelo Lema 4.1, temos j 0 ∈ HPy e α = d − n(Px , −j 0 ) − n(Py , j 0 ).
Sejam R = [Px ]j e R0 = (α · j 0 )|[Py ]j 0 . Como j 0 ∈ HPx ∩ HPy , pela Proposição 4.5,
se s1 ∈ =R e s2 ∈ =R0 , então s1 6= s2 . Assim, Ti [x, 0]||Ti0 [x, 0].
Caso 3: j ∈ HPx e j 0 ∈ J − (HPx ∪ HPx ). De acordo com o Lema 4.5, Ti [x, 0]
−j 0
possui j como seu último salto e existe um vértice y = x − j 0 tal que x → y juntamente com o caminho Ti0 [y, 0] forma o único caminho de ligação entre os vértices x
e 0 em Ti0 . A árvore Ti0 [y, 0] possui j 0 como seu último salto. Assim, j 0 ∈ HPy . Seja
R = [Px ]j e R0 = (−j 0 )|[Py ]j 0 . Como j 0 ∈
/ HPx ∪ HPx e j 0 ∈ HPy , pela Proposição
4.6, se s1 ∈ =R e s2 ∈ =R0 , então s1 6= s2 . Portanto, Ti [x, 0]||Ti0 [x, 0].
Caso 4: j, j 0 ∈ HPx . Pelo Lema 4.5, existe um vértice y = x + α · j tal que
j
x ⇒α y junto com o caminho Ti [y, 0] forma o único caminho de ligação entre x
j0
e 0 em Ti . Da mesma forma, existe um vértice z = x + β · j 0 tal que x ⇒β z ,
juntamente com o caminho Ti0 [z, 0] forma o único caminho de ligação entre x e 0
em Ti0 . Em particular, Ti [y, 0] possui j como seu último salto e Ti0 [z, 0] tem j 0 como
seu último salto. Assim, j ∈ HPy ej 0 ∈ HPz . Podemos assumir que |j| < |j 0 |, sem
perda de generalidade. Pelo Lema 4.3, j ∈ HPz e α + n(Pz , −j) + n(Py , j) = d.
Sejam R = (α · j)|[Py ]j e R0 = (β · j 0 )|[Pz ]j 0 . Como j ∈ HPy ∩ HPz e j 0 ∈ HPz , pela
Proposição 4.7, se s1 ∈ =R e s2 ∈ =R0 , então s1 6= s2 . Assim, Ti [x, 0]||Ti0 [x, 0].
Caso 5: j, j 0 ∈ J −(HPx ∪HPx ). Pelo Lema 4.5, existe um vértice y = x−j tal que
−j
x → y junto com o caminho Ti [y, 0] forma o único caminho que liga x e 0 na árvore
−j 0
Ti . Da mesma forma, existe um vértice z = x − j 0 tal que x → z juntamente com o
caminho Ti0 [z, 0] forma o único caminho de ligação entre x e 0 em Ti0 . Ti [y, 0] possui
j como seu último salto e Ti0 [z, 0] tem j 0 como seu último salto. Assim, j ∈ HPy e
/ HPx ∪ HPx , nenhum dos termos j, −j, j 0 e −j 0 estão contidos
j 0 ∈ HPz . Como j, j 0 ∈
em HPx ou HPx . Pelo Lema 4.2, HPy = HPx ∪ {j} e HPz = HPx ∪ {j 0 }. Isso mostra
/ HPy ∪ HPy . Sejam R = (−j)|[Py ]j e R0 = (−j 0 )|[Pz ]. Como
que j ∈
/ HPz ∪ HPz e j 0 ∈
j ∈ HPy − (HPz ∪ HPz ) e j 0 ∈ HPz − (HPy ∪ HPy ), pela Proposição 4.8, se s1 ∈ =R e
s2 ∈ =R0 , então s1 6= s2 . Assim, Ti [x, 0]||Ti0 [x, 0].
Caso 6: j ∈ HPx e j 0 ∈ J − (HPx ∪ HPx ). Conforme o Lema 4.5, temos um
j
vértice y = x + α · j tal que x ⇒α y juntamente com o caminho Ti [y, 0] forma o
único caminho de ligação entre os vértices x e 0 na árvore Ti . Além disso, existe
−j 0
um vértice z = x − j 0 tal que x → z , juntamente com o caminho Ti [z, 0] forma
o único caminho de ligação entre os vértices x e 0 na árvore Ti0 . Ti [y, 0] possui j
como seu último salto e Ti0 [z, 0] tem j 0 como seu último salto. Assim, j ∈ HPy e
j 0 ∈ HPz . Pelo Lema 4.4, j ∈ HPz e α + n(Pz , −j) + n(Py , j) = d. Considere as
sequências R = (α · j)|[Py ]j e R0 = (−j 0 )|[Pz ]j 0 . Como j ∈ HPy ∩ HPz e j 0 ∈ HPz ,
pela Proposição 4.9, se s1 ∈ =R e s2 ∈ =R0 , então s1 6= s2 . Assim, Ti [x, 0]||Ti0 [x, 0].
Como escolhemos x arbitrariamente no grafo C(cdm , d), as árvores Ti e Ti0 são
independentes.
4.4
O problema das árvores geradoras independentes
64
Combinando os lemas 4.5 e 4.6, temos o seguinte teorema:
Teorema 4.1 O algoritmo de construção de δm IST's em C(cdm , d) com d > 2 pode
ser executado na complexidade de tempo O(mN ), onde N = c × dm .
Conforme o Teorema 4.1, o algoritmo pode ser paralelizado em
O(N )
4.4
processadores para rodar em complexidade de tempo
C(cdm , d) usando
O(m).
IST's em grafos gaussianos
Finalizando o trabalho, foi feita uma busca para um algoritmo que determine possíveis árvores geradoras independentes em grafos gaussianos, o que é inédito na
literatura até então.
O mesmo foi implementado e o programa resultante gerou
resultados para alguns grafos gaussianos.
A ideia foi tomar o vértice
0 + 0i
como raiz.
A partir dele, são construídas 4
árvores, sendo que cada uma delas possui como lho um dos 4 vértices adjacentes a
0 + 0i
(Grafos Gaussianos possuem grau 4). Cada lho, é pai dos outros 3 vértices
adjacentes a ele. Desses últimos, são tomados como lhos os adjacentes a eles que
ainda não aparecem na árvore, sendo que a construção é feita seguindo uma ordem
prexada, da direita para esquerda, entre folhas que estão no mesmo nível da árvore.
Esse ordenamento é feito baseado na estrutura do grafo gaussiano, onde cada vértice
possui um adjacente acima, um abaixo, um a direita e outro a esquerda. Seguindo
os passos anteriores e fazendo o mesmo para todos os vértices que surgirem na
construção, obtemos as 4 árvores.
Observe que, usando esse raciocínio, 4 árvores são sempre construídas, mas não
há a garantia de que elas são independentes. Por isso, após a construção, vericamos
quais dessas árvores são independentes entre si, fazendo uma comparação entre todas
as combinações de pares de árvores.
Na implementação do programa, utilizamos a idéia de listas, estruturas de dados
bem conhecidas, e uma série de funções auxiliares para exibir árvores geradoras dessa
classe especíca de grafos, cujo conhecimento teórico foi desenvolvido ao longo da
dissertação. É importante lembrar que, por ter um algoritmo de roteamento mais
simples, e uma rotulação de vértices mais conveniente para se trabalhar em relação
aos grafos circulantes, essas IST's podem ter grande utilidade em problemas reais.
Os códigos-fontes desse último programa também estão presentes no Anexo 1.
Exemplo 4.5 Consideremos o grafo Gaussiano G2+3i . Executando o programa,
obtemos as árvores 2 e 4 são independentes, assim como as árvores 3 e 4 o são.
4.4
O problema das árvores geradoras independentes
Figura 4.12: Árvore 2 gerada pelo programa
Figura 4.13: Árvore 3 gerada pelo programa
Figura 4.14: Árvore 4 gerada pelo programa
As árvores também podem ser vistas da seguinte forma:
65
4.4
O problema das árvores geradoras independentes
Figura 4.15: Árvore Geradora 2
Figura 4.16: Árvore Geradora 3
Figura 4.17: Árvore Geradora 4
66
Capítulo 5
Conclusão e Trabalhos Futuros
5.1
Conclusão
Este trabalho desenvolve algoritmos para o roteamento em diferentes tipos de redes
interligadas modeladas por grafos circulantes e gaussianos, fazendo uso, sobretudo,
de conceitos e resultados de álgebra avançada e de ferramentas de computação paralela.
Em um primeiro momento, o Anel dos Inteiros Gaussianos foi estudado com
mais detalhes.
Também foram estudados alguns resultados sobre os grafos circu-
lantes e grafos gaussianos, objetos matemáticos utilizados nas modelagens das redes
interligadas que consideramos. Todas as demonstrações foram refeitas e provas alternativas foram sugeridas.
c
Foram desenvolvidos, através do software MATLAB , programas que ilustram
os grafos circulantes e gaussianos, considerados no trabalho.
Um programa foi implementado para apresentar uma visualização alternativa
para o grafo Gaussiano, cuja topologia chamaremos losangular. Nela, cada vértice
do mesmo é transformado no elemento que possui a menor norma em sua classe de
equivalências de
Gα
e as adjacências são preservadas. Obviamente, esse novo grafo
gerado é isomorfo ao obtido anteriormente. Os códigos-fontes dos programas estão
presentes no Anexo 1.
Para a solução do problema de roteamento em grafos gaussianos e em grafos
circulantes foram desenvolvidos também programas que ilustram as melhores rotas
nas duas classes de de grafos estudados.
Foram implementados também programas para busca de árvores geradoras independentes (IST's) em RC-Grafos baseados nos resultados teóricos provados no
Capítulo 4. Neles, é possível saber qual o pai de cada vértice em uma determinada
árvore. Cada uma delas é ilustrada separadamente apenas com os parâmetros de
entrada
c, d
e
m,
que caracterizam o Grafo Circulante Recursivo no qual é feita a
pesquisa das IST's.
Além disso, o trabalho propõe uma algoritmo eciente para se encontrar IST's
em grafos gaussianos em geral.
Os resultados obtidos possuem grande relevância pelo fato de atualmente o
número de redes interligadas está cada vez maior, uma vez que sistemas paralelizados
estão mais frequentes, e a comunicação destas redes pede mais eciência na transmissão de um ponto a outro das mesmas. Podemos notar uma interdisciplinaridade
67
5.2
Conclusão e Trabalhos Futuros
68
no estudo da matemática avançada para solucionar problemas práticos no campo
da computação.
5.2
Trabalhos Futuros
A partir do estudo apresentado, podemos sugerir algumas opções para possíveis
trabalhos futuros:
•
Encontrar algoritmos de roteamento e visualização, com funções semelhantes
aos apresentados ao longo do texto, mas sob um paradigma de programação
diferente, o de orientação a objetos, o que permitiria a implementação na
plataforma JAVA, por exemplo.
•
Procurar estruturas algébricas que seja capazes de gerar grafos tridimensionais.
•
Desenvolver novos algoritmos para busca de árvores geradoras independentes
em Grafos Gaussianos, que encontrem tais árvores em um número maior de
grafos.
Referências
BERMOND, J.-C.; COMELLAS, F.; HSU, D.F.,
Distributed loop computer
networks: A survey, Jornal of Parallel and Distributed Computings 24 (1995)
2-10
BEIVIDE, R.; HERRADA, E.; BALCBAZAR, J. L.; ARRUABARRENA, A.
Optimal Distance Networks of Low Degree for Parallel Computers, IEEE
Trans. Computer, vol. 40, no. 10, Octuber 1991.
CAI, J.-Y.; HAVAS, G.; MANS, B.; NERURKAR, A.; SEIFERT, J.-P.;
SHPARLINSKI, I.
On Routing in Circulant Graphs, Proc.
Fifth Ann. Int'l
Computing and Combinatorics Conf., 1999.
A Discrete
Optimization Problem in Local Networks and Data Alignment, IEEE
FIOL, M.A.; YEBRA, J.L.; ALEGRE, I.; VALERO, M.
Trans. Computers, vol. 36, no. 6, pp. 702-713, June 1987.
GILBERT, W. J.
Modern Algebra with applications, second edition, United
States of America, Wiley-Interscience, 2004, 349 p.
Otimização combinatória e programação linear:
modelos e algoritmos, Rio de Janeiro, Editora Campus, 2000, p. 276-279.
GOLDBARG, M. C.
GONÇALVES, A.
Introdução à Álgebra, Rio de Janeiro, IMPA, 1979, 194 p.
HUNGERFORD, T. W.
Abstract Algebra: An Introduction, Second Edition,
Saunders College Publishing, United States of America, 1997.
HUSSAIN, Z. On Shortest Disjoint Paths and Hamiltonian Cycles in
Some Interconnection Networks, 2011, 107 f. Doctor Tesis, Oregon State
University, april 2011.
MARTINEZ, C.
Codes and Graphs over Complex Integer Rings, 2007.
f. Doctoral Thesis, Universidad de Cantabria, Santander, January 2007.
Dense
gaussian networks: Suitable topologies for on-chip multiprocessors,
MARTINEZ, C.; VALLEJO E.; BEIVIDE, R.; IZU, C.; MORETO, M.
International Journal of Parallel Programming, vol. 34, pp.
69
193 − 211,
2006.
107
5.2
Referências
70
MARTINEZ, C.; BEIVIDE, R.; STAFFORD, E.; MORETO, M.; GABIDULIN, E.
Modeling toroidal networks with the gaussian integers, IEEE Transactions
on Computers, vol. 57, no. 8, pp.
NETTO, P. O. B.
1046 − 1056,
2008.
Grafos: teoria, modelos, algoritmos, São Paulo:
Edgard
Blucher, 2006.
Construction Multiple Independent
Spanning trees on Recursive Circulant Graphs G(2m , 2), International
YANG, J. S.; TANG, S. M.. WANG, Y.L
Journal of Foundations of Computer Science Vol.
21,
No. 1 (2010)
YANG, J.-S.; CHANGA, J.-M.; TANGB, S.-M.; WANGC, Y.-L.
73 − 90.
On the
independent spanning trees of recursive circulant graphs G(cdm , d), with
d > 2n ,
Theoretical Computer Science 410, 2009.
Anexo 1
Neste anexo são apresentados os códigos-fontes dos algoritmos desenvolvidos e implementados durante o trabalho.
Algoritmo de Roteamento em Grafos Circulantes
Este algoritmo tem como funcionalidades encontrar um menor caminho entre dois
vértices quaisquer de um grafo circulante e ilustrar o caminho encontrado.
Função Principal:
Menorcaminhocirculante
Funções Auxiliantes:
algoritmo, euclidesest, circulante, Desenhacaminho
Desenhacaminho
function[]=Desenhacaminho(N,z,m,n,A,B)
k=0;
i=m;
%k indica a quantidade de vezes que o salto A é realizado no caminho
%i é variável auxiliar para indicar quais vertices serão ligados
%pela aresta que sera colorida.
arg = (2*pi)/N;
%Ângulo para o grafo circulante (necessario para o
%desenho do caminho)
%Este 'while' faz o caminho com cor azul indicando o número de saltos com A
while (k<abs(z(1)))
k=k+1;
if z(1)>0
%Sentido Anti-Horario (deve-se somar A)
plot([cos((i)*arg) cos((i+A)*arg)],[sin((i)*arg) sin((i+A)*arg)],'y',
[cos((i)*arg) cos((i+A)*arg)], [sin((i)*arg) sin((i+A)*arg)],'oy');
hold on;
i=i+A;
else
%Sentido Horario (deve-se subtrair A)
plot([cos((i)*arg) cos((i-A)*arg)],[sin((i)*arg) sin((i-A)*arg)],'y',
[cos((i)*arg) cos((i-A)*arg)], [sin((i)*arg) sin((i-A)*arg)],'oy');
hold on;
i=i-A;
end
71
5.2
Anexo
72
end
k=0; %A variável k é reutilizada para indicar a quantidade de vezes que o
%salto B é realizado no caminho
%Este 'while' faz o caminho com cor vermelha indicando o número de saltos com B
while (k<abs(z(2)))
k=k+1;
if z(2)>0
%Sentido Anti-Horário (deve-se somar B)
plot([cos((i)*arg) cos((i+B)*arg)],[sin((i)*arg) sin((i+B)*arg)],'r',
[cos((i)*arg) cos((i+B)*arg)], [sin((i)*arg) sin((i+B)*arg)],'or');
hold on;
i=i+B;
else
%Sentido Horário (deve-se subtrair B)
plot([cos((i)*arg) cos((i-B)*arg)],[sin((i)*arg) sin((i-B)*arg)],'r',
[cos((i)*arg) cos((i-B)*arg)], [sin((i)*arg) sin((i-B)*arg)],'or');
hold on;
i=i-B;
end
end
plot(cos((m)*arg),sin((m)*arg),'xk');
plot(cos((m)*arg),sin((m)*arg),'ok');
plot(cos((n)*arg),sin((n)*arg),'xm');
plot(cos((n)*arg),sin((n)*arg),'om');
%Colore
%Colore
%Colore
%Colore
o
o
o
o
end
algoritmo
function[result]=algoritmo(euc,a,b,c)
%Calcula X, Y que satisfaçam aX + bY = c,
%sendo |X| + |Y| mínimo.
%Parâmetros de entrada: a,b,c
%Parâmetros de saída: X,Y
%Restrição que MDC(a,b) seja 1 ou -1
%A(3) = mdc
if euc(3)>0 x0 = euc(1)*c; y0 = euc(2)*c; end
if euc(3)<0 x0 = -euc(1)*c; y0 = -euc(2)*c; end
if a ~= b
t0 = floor((x0+y0)/(a-b));
else
t0=1;
end
vértice
vértice
vertice
vertice
de
de
de
de
origem de preto
origem de preto
destino de amarelo
destino de amarelo
5.2
Anexo
73
t=t0; vant=abs(x0+(t0-1)*b) + abs(y0-(t0-1)*a); m=abs(x0 +(t0)*b) +
abs(y0 - (t0)*a); while(m<=vant)
t=t+1;
vant=m;
m=abs(x0 + b*t) + abs(y0 - a*t);
end z(1)=x0 + b*(t-1); z(2)=y0 - a*(t-1);
t=t0-2; m=abs(x0 + (t0-2)*b) +
(t0-1)*b) + abs(y0- (t0-1)*a);
t=t-1;
vant=m;
m=abs(x0 + b*t) + abs(y0 end w(1)=x0 + b*(t+1); w(2)=y0
abs(y0 - (t0-2)*a); vant=abs(x0 +
while(m<=vant)
a*t);
- a*(t+1);
if abs(z(1))+abs(z(2)) > abs(w(1))+abs(w(2))
result=w;
else
result=z;
end
end
Algoritmo de Roteamento em Grafos Gaussianos
ShortestPath(u, v, w ) busca o menor caminho entre dois vértices de um grafo gaussiano gerado por
w.
O resultado é ilustrado em duas topologias diferentes (em L e
losangular).
Função Principal:
ShortestPah
Funções Auxiliantes:
converter, converterporiginal, gaussiano,
gaussianoconverter
ShortestPath
function[]=ShortestPath(u,v,w)
%u=[x y] : Source
%v=[x' y'] : Destination
%w=[a b] : graph generator
close all; clc a=w(1); b=w(2); N=a^2+b^2;
5.2
Anexo
74
plot(u(1),u(2),'xk'); %Ponto Inicial
plot(v(1),v(2),'xk'); %Ponto Final
hold on; gaussianoconverter(a,b); hold on;
%Faz o desenho do grafo gaussiano com os pontos final e inicial
sem indicar ainda o melhor caminho entre eles
x0 = v(1) - u(1);
y0 = v(2) - u(2);
%x' - x
%y' - y
x(1) = x0 - a; y(1) = y0 - b; s(1) = abs(x(1)) + abs(y(1));
x(2) = x0 + a; y(2) = y0 + b; s(2) = abs(x(2)) + abs(y(2));
x(3) = x0 - b; y(3) = y0 + a; s(3) = abs(x(3)) + abs(y(3));
x(4) = x0 + b; y(4) = y0 - a; s(4) = abs(x(4)) + abs(y(4));
x(5) = x0 + (a-b); y(5) = y0 + (a+b); s(5) = abs(x(5)) + abs(y(5));
x(6) = x0 - (a-b); y(6) = y0 - (a+b); s(6) = abs(x(6)) + abs(y(6));
x(7) = x0 + (a+b); y(7) = y0 + (b-a); s(7) = abs(x(7)) + abs(y(7));
x(8) = x0 - (a+b); y(8) = y0 - (b-a); s(8) = abs(x(8)) + abs(y(8));
x(9) = x0 + 2*a; y(9) = y0 + 2*b; s(9) = abs(x(9)) + abs(y(9));
x(10) = x0 - 2*a; y(10) = y0 - 2*b; s(10) = abs(x(10)) + abs(y(10));
x(11) = x0 - 2*b; y(11) = y0 + 2*a; s(11) = abs(x(11)) + abs(y(11));
x(12) = x0 + 2*b; y(12) = y0 - 2*a; s(12) = abs(x(12)) + abs(y(12));
x(13) = x0; y(13) = y0; s(13) = abs(x(13)) + abs(y(13));
t=converter(v,w);
%Armazena no vetor t qual a posição do vetor de destino (v) no novo
%grafo gaussiano.
menor=s(1); k=1; for i=2:13
if s(i)<=menor
menor=s(i);
k=i;
end
end
%r1 e r2 armazenam o resultado do par encontrado acima
r1 = x(k) r2 = y(k)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Esta parte desenha o caminho entre o vertice de origem e o vertice de
%destino no grafo gaussiano convertido, onde temos:
%Origem: converter([u(1) u(2)],w)
Destino: converter([v(1) v(2)],w)
A=u;
if r1>0
5.2
Anexo
75
for i=1:r1
VA=converter([A(1)
A(2)],w);
VB=converter([A(1)+1 A(2)],w);
A(1)=A(1)+1;
plot([VA(1) VB(1)],[VA(2) VB(2)],'k',[VA(1) VB(1)],[VA(2) VB(2)],'ok');
hold on;
end
end
if r1<0
for i=1:-r1
VA=converter([A(1) A(2)],w);
VB=converter([A(1)-1 A(2)],w);
A(1)=A(1)-1;
plot([VA(1) VB(1)],[VA(2) VB(2)],'k',[VA(1) VB(1)],[VA(2) VB(2)],'ok');
hold on;
end
end
if r2>0
for i=1:r2
VA=converter([A(1) A(2)],w);
VB=converter([A(1) A(2)+1],w);
A(2)=A(2)+1;
plot([VA(1) VB(1)],[VA(2) VB(2)],'k',[VA(1) VB(1)],[VA(2) VB(2)],'ok');
hold on;
end
end
if r2<0
for i=1:-r2
Z=converter([A(1) A(2)],w);
W=converter([A(1) A(2)-1],w);
A(2)=A(2)-1;
plot([Z(1) W(1)],[Z(2) W(2)],'k',[Z(1) W(1)],[Z(2) W(2)],'ok');
hold on;
end
end
%Abaixo faz o desenho dos pontos inicial e final no grafo gaussiano
%convertido.
V=converter([u(1)
u(2)],w);
plot(V(1),V(2),'ok');
V=converter([v(1)
v(2)],w);
plot(V(1),V(2),'ok');
hold on
5.2
Anexo
76
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(2) gaussiano(w(1),w(2))
A=u;
if r1>0
for i=1:r1
VA=converterporiginal([A(1)
A(2)],w);
VB=converterporiginal([A(1)+1 A(2)],w);
A(1)=A(1)+1;
plot([VA(1) VB(1)],[VA(2) VB(2)],'k',[VA(1) VB(1)],[VA(2) VB(2)],'ok');
hold on;
end
end
if r1<0
for i=1:-r1
VA=converterporiginal([A(1)
A(2)],w);
VB=converterporiginal([A(1)-1 A(2)],w);
A(1)=A(1)-1;
plot([VA(1) VB(1)],[VA(2) VB(2)],'k',[VA(1) VB(1)],[VA(2) VB(2)],'ok');
hold on;
end
end
if r2>0
for i=1:r2
VA=converterporiginal([A(1) A(2)],w);
VB=converterporiginal([A(1) A(2)+1],w);
A(2)=A(2)+1;
plot([VA(1) VB(1)],[VA(2) VB(2)],'k',[VA(1) VB(1)],[VA(2) VB(2)],'ok');
hold on;
end
end
if r2<0
for i=1:-r2
VA=converterporiginal([A(1) A(2)],w);
VB=converterporiginal([A(1) A(2)-1],w);
A(2)=A(2)-1;
plot([VA(1) VB(1)],[VA(2) VB(2)],'k',[VA(1) VB(1)],[VA(2) VB(2)],'ok');
hold on;
end
end
plot(u(1),u(2),'ok'); plot(v(1),v(2),'ok'); hold on
5.2
Anexo
77
%Este if calcula o diâmetro do grafo
if mod(N,2)==1 %N odd
diametro = b-1
else
%N even
diametro = b end
end
converter
function[D]=converter(alpha,gerador)
%Converte o elemento alpha em G_gerador para o elemento que possui a
%menor norma dentro da sua classe de equivalência.
%gerador = a+bi (gerador do grafo)
%alpha = c+di (elemento a ser convertido)
a=gerador(1); b=gerador(2); c=alpha(1); d=alpha(2); N=a^2+b^2;
D(1)=real(c+d*i-round((c+d*i)*(a-b*i)/N)*(a+b*i));
D(2)=imag(c+d*i-round((c+d*i)*(a-b*i)/N)*(a+b*i)); end
converterporiginal
function[R]=converterporiginal(alpha,gerador)
%Converte o elemento alpha em G_gerador para o elemento que possui a
%menor norma dentro da sua classe de equivalência.
%gerador = a+bi (gerador do grafo)
%alpha = c+di (elemento a ser convertido)
a=gerador(1); b=gerador(2); c=alpha(1); d=alpha(2); N=a^2+b^2;
D(1)=real(c+d*i-round((c+d*i)*(a-b*i)/N)*(a+b*i));
D(2)=imag(c+d*i-round((c+d*i)*(a-b*i)/N)*(a+b*i));
R=D;
if (D(2)>=a)
R(2)=D(2)-a;
R(1)=D(1)+b;
%'cond 1';
end
if ((D(1)<0) && (D(2)<a))
if D(2)>-(b-a+1)
5.2
Anexo
78
R(1)=D(1)+a+b;
R(2)=D(2)+b-a;
%'cond 2';
end
end
if D(2)<-(b-a)
R(1)=D(1)+a;
R(2)=D(2)+b;
%'cond 3 part1';
end
if ((D(1)>=0) && (D(2)<0))
R(1)=D(1)+a;
R(2)=D(2)+b;
%'cond 3 part2'
end
end
gaussiano
function[ ]=gaussiano(a,b)
%Plota num plano bidimensional o grafo gaussiano com parâmetros a e b
%Restrição: 0<= a <=b
%linhas horizontais inferiores
for k=0:a-1
for m=0:a+b-2
plot([m m+1],[k k],'g',[m m+1],[k k],'or');
hold on;
end
end
%linhas horizontais superiores
for k=a:b-1
for m=a:a+b-2
plot([m m+1],[k k],'g',[m m+1],[k k],'or');
hold on;
end
end
%linhas verticais do menor quadrado (esquerdo)
for k=0:a-2
for m=0:a-1
plot([m m],[k k+1],'g',[m m],[k k+1],'or');
5.2
end
Anexo
79
hold on;
end
%linhas verticais do maior quadrado (direito)
for k=0:b-2
for m=a:a+b-1
plot([m m],[k k+1],'g',[m m],[k k+1],'or');
hold on;
end
end
for x=0:b-1 plot([x x+a],[0 b-1],'g',[x x+a],[0 b-1],'or'); hold on;
end
for x=b:a+b-1 plot([x x-b],[0 a-1],'g',[x x-b],[0 a-1],'or'); hold
on; end
for y=0:a-1 plot([0 a+b-1],[y y+b-a],'g',[0 a+b-1],[y y+b-a],'or');
hold on; end
for y=a:b-1 plot([a a+b-1],[y y-a],'g',[a a+b-1],[y y-a],'or'); hold
on; end
end
gaussianoconverter
function[ ]=gaussianoconverter(a,b)
%Plota num plano bidimensional o grafo gaussiano com parâmetros a e b
%Restrição: 0<= a <=b
close all;
%linhas horizontais inferiores
for k=0:a-1
for m=0:a+b-2
A=converter([m k],[a b]);
B=converter([m+1 k],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'b',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
end
%linhas horizontais superiores
for k=a:b-1
for m=a:a+b-2
A=converter([m k],[a b]);
5.2
end
Anexo
end
80
B=converter([m+1 k],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'b',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
%linhas verticais do menor quadrado (esquerdo)
for k=0:a-2
for m=0:a-1
A=converter([m k],[a b]);
B=converter([m k+1],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'b',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
end
%linhas verticais do maior quadrado (direito)
for k=0:b-2
for m=a:a+b-1
A=converter([m k],[a b]);
B=converter([m k+1],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'b',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
end
for x=0:b-1
A=converter([x 0],[a b]);
B=converter([x+a b-1],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'b',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
for x=b:a+b-1
A=converter([x 0],[a b]);
B=converter([x-b a-1],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'b',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
for y=0:a-1
A=converter([0 y],[a b]);
B=converter([a+b-1 y+b-a],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'b',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
5.2
Anexo
81
end
for y=a:b-1
A=converter([a y],[a b]);
B=converter([a+b-1 y-a],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'b',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
end
Algoritmo para exibição de árvores geradoras independentes em RC-Grafos
GenParents([x(1)x(2)...x(m+1)], c, d, m) determina todos os pais do vértice [x(1)x(2)...x(m+
1)]d (na base d) em cada árvore geradora independente do grafo circulante com cXdm
vértices.
Função Principal:
GenParents
Funções Auxiliantes:
ShorstestPath
GenParents
function[]=GenParents(c,d,m)
%Parâmetros de entrada:
% c,d,m: valores que darão a quantidade de vértices do grafo N(V)=(cd^m)
% Parâmetros de saída:
% As saídas aparecem na seguinte sequência:
% - HPX (saltos que realmente aparecem no caminho P_x)
% - IPX (primeira linha da matriz I(P_x)
%
% Obs.: Para identificar cada árvore geradora, a primeira coluna fornece o
% sinal (1 para positivo e -1 para negativo) e a segunda coluna, o número
% da árvore. Na terceira coluna aparecem os pais correspondentes.
% Esta versão do GenParents desenhas as árvores geradoras
clc close all;
% Este 'for' inicializa o vetor X com 0's
q=0; % q é o número de vértices em que a busca por pais será feita
5.2
Anexo
82
for t=1:m+1
X(t)=0;
q=q+(d-1)*d^t;
end q=q-(m+1)*d;
% X(m+1 - (?)) resolve o problema de [0 0 1] ser trocado por [1 0 0]
r=0;
if c>d || c==d
r=q;
'c deve ser menor que d'
end
while(r<q) %'while' principal
r=r+1; % r é a variável que indicará quando o while será finalizado
X(m+1)=X(m+1)+1;
for i=0:m-1
if X(m+1-(i))==d
X(m+1-(i))=0;
X(m+1-(i+1))=X(m+1-(i+1))+1;
end
end
aux=r;
% Este 'for' calcula x (vértice)
x=0;
for i=0:m
x=x+ X(m+1-i)*d^(i); % x é calculado em valor inteiro (decimal)
end
% Calcula N (número de vértices do grafo) e arg é o ângulo usado
% nos desenhos das árvores geradoras
N=c*d^m; arg = (2*pi)/N;
% Este 'for' calcula o conjunto J (saltos)
for i=0:floor(log10(N)/log10(d)+1)-1
J(i+1)=d^i;
J(i+2+floor(log10(N)/log10(d)+1)-1)=-d^i;
end
if c>2
deltam=2*m+2;
end
if c==1 && d==2
deltam=2*m-1;
5.2
Anexo
83
end
if c==1 && d>2
deltam=2*m;
end
if c==2
deltam=2*m+1;
end
% Obtém HPX da função auxiliar "ShortestPath"
HPX=ShortestPath(X,c,d,m);
% tam é o tamanho do vetor HPX
tam=length(HPX);
%Calcula HPXBARRA em função de c
if c~=2
HPXBARRA=-HPX;
else
end
HPXBARRA=-HPX;
for i=1:length(HPXBARRA)-1
if HPXBARRA(i)==d^m || HPXBARRA(i)==-d^m
HPXBARRA(i)=HPXBARRA(length(HPXBARRA));
end
end
% Este 'for' calcula IPX, a primeira linha da matriz I(P_x)
for t=1:tam
min=HPX(t);
for k=t:tam
if abs(HPX(k))<min
min=HPX(K)
end
end
IPX(t)=min;
end
x
IPX
% Corresponde ao 'for' do algoritmo (parte 2)
for i=1:deltam
lambda(i)=-max(-(i-1),-(deltam-(i-1)-1));
% Os dois 'if' a seguir são a parte 3 do algoritmo
if i-1<lambda(i) || i-1==lambda(i)
5.2
Anexo
84
else
end
j=-d^(lambda(i));
sinal=-1;
i-1>lambda(i)
j=d^(lambda(i));
sinal=1;
V1=0;
%Variável auxiliar para verificar se j está em HPX
%V1=1 <=> j está em HPX
%V1=0 <=> j não está em HPX
V2=0;
%Variável auxiliar para verificar se j está em HPXBARRA
posj=0;
%Variável que será ulitizala pra ver a posição de j em IPX
%procura em qual posição de IPX j está
for k=1:tam
%tam = length(HPX) = length(IPX)
if j==IPX(k)
posj=k;
end
end
%Este 'if' elimina o problema de j poder estar
%na última posiçao indicando que seu sucessor
%estará na primeira posição
if posj==tam
posj=0;
end
for k=1:tam
if j==HPX(k)
V1=1;
end
end
if V1==1 % V1=1 significa que j pertence a HPX
A=x+IPX(posj+1);
if A < 0
A=x+IPX(posj+1)+N;
end
if A>=N
A=A-N;
end
5.2
Anexo
85
% Determinam qual árvore sera desenhada
fig=sinal*lambda(i)+deltam+3;
% + delta + 3 faz com que fig seja estritamente
%positivo e diferente de 1 e de 2 fig=1 e fig=2
%são reservados para a situação abaixo:
if sinal*lambda(i)==0
if sinal==1
fig=1;
end
end
if sinal==-1
fig=2;
end
figure(fig)
plot([cos(x*arg) cos(A*arg)],[sin(x*arg) sin(A*arg)],'k',
[cos(x*arg) cos(A*arg)],[sin(x*arg) sin(A*arg)],'ob');
hold on;
[sinal lambda(i) A]
else % Isto significa que V1=0, ou seja,j não pertence a HPX
for k=1:length(HPXBARRA)
if j==HPXBARRA(k)
V2=1;
end
end
if V2==1 % V2=1 significa que j pertence a HPXBARRA
A=x+j;
if A < 0
A=x+j+N;
end
if A>=N
A=A-N;
end
% Determinam qual árvore sera desenhada
fig=sinal*lambda(i)+deltam+3;
%+ delta + 3 faz com que fig seja estritamente
%positivo e diferente de 1 e de 2 fig=1 e fig=2
%são reservados para a situação abaixo:
if sinal*lambda(i)==0
if sinal==1
fig=1;
end
if sinal==-1
5.2
Anexo
86
end
end
fig=2;
figure(fig)
plot([cos(x*arg) cos(A*arg)],[sin(x*arg) sin(A*arg)],'k'
[cos(x*arg) cos(A*arg)],[sin(x*arg) sin(A*arg)],'ob');
hold on;
[sinal lambda(i) A]
else % V2=0(significa que j não pertence a HPXBARRA)
A=x-j;
if A < 0
A=x-j+N;
end
if A>=N
A=A-N;
end
% Determinam qual árvore será desenhada
fig=sinal*lambda(i)+deltam+3;
%+ delta + 3 faz com que fig seja estritamente
%positivo e diferente de 1 e de 2 fig=1 e fig=2
%são reservados para a situação abaixo:
if sinal*lambda(i)==0
if sinal==1
fig=1;
end
if sinal==-1
fig=2;
end
end
figure(fig)
plot([cos(x*arg) cos(A*arg)], [sin(x*arg) sin(A*arg)],'k',
[cos(x*arg) cos(A*arg)], [sin(x*arg) sin(A*arg)],'ob');
hold on;
[sinal lambda(i) A]
end
end
end %finaliza o for
%Este if evita que o programa procure os pais do último vértice que é
%congruente ao vértice 0. Estes pais não existem.
%Este é o momento que o loop termina
if x==c*d^m-1
5.2
Anexo
87
r=q; %isto força a parada do while
end
end %finaliza o while principal
%Este if faz com que o programa exiba deltam quando ele realmente for
%calculado. Caso c>=d, o programa não entra no 'while'.
if c<d
deltam
end
end %finaliza o programa
ShortestPath
function[HPX]=ShortestPath(X,c,d,m)
%X=[ 1 ... m-1 m
m+1] <-> X=[x_m ... x_2 x_1
x_0]
Carry=0; N= c*d^m; z=0; P=0;
for i=0:m-1
if (0 < X(m+1-i) && X(m+1-i) <= floor(d/2))
z=z+1;
HPX(z)=-d^i;
%nHPX(z)=X(m+1-i);
Carry = 0;
else
if (floor(d/2) < X(m+1-i) && X(m+1-i) <= d-1)
z=z+1;
HPX(z)=+d^i;
%nHPX(z)=d-X(m+1-i);
X(m+1-i-1) = X(m+1-i-1) + 1;
Carry = 1;
else
if Carry==1
X(m+1-i-1) = X(m+1-i-1) + 1;
end
end
end
end
%obs.: X(1) = x_m
if (c>=2 && 0 < X(1) && X(1) <= floor(c/2))
z=z+1;
HPX(z)=-d^m;
5.2
Anexo
else
end
88
%nHPX(z)=X(1);
if (c>2 && floor(c/2) < X(1) && X(1) <= c-1)
z=z+1;
HPX(z)=+d^m;
%nHPX(z)=c-X(1);
end
end
Algoritmo para exibição de árvores geradoras independentes em Grafos Gaussianos
Este programa gera árvores geradoras em grafos gaussianos. O comando arvore([ab])
faz com o que o program execute e busque 4 árvores geradoras para o grafo gaussiano,
exibidas em 4 guras na topologia losangular.
Função Principal:
arvore
Funções Auxiliantes:
adjacencias, caminhos, converter, converterporiginal,
disjuntos, gaussianoconverter, plotaadjacentes
arvore
function[]=arvore(w)
%w=[a b] : graph generator
clc close all a=w(1); b=w(2);
N=a^2+b^2; %numero de vertices do grafo
L=[0 0]; %L será um vetor que armazenara a lista dos vertices a serem
%varridos pelo programa
ltam=0; %ltam é o tamanho do vetor L utilizado
L2=[0 0]; %L2 é uma lista temporaria de auxilio a L
ltam2=0; %ltam é o tamanho do vetor L2 utilizado
%V é uma matriz que armazenara todos vertices ja visitados no grafo
%size(V) = Vtam (linhas) x 2 (colunas)
V(1,1)=0; V(1,2)=0; V(1,:)=[0 0];
%Vtam é o número de linhas da matriz V
Vtam=1;
M=adjacencias(w); %Coloca em M a matriz de adjacencias
5.2
Anexo
89
gaussianoconverter(a,b); %desenha o grafo gaussiano na topologia losangular
hold on;
u=converter([0 -1],w); %Vértice imediamente abaixo do 0+0i na topologia losangula
V(2,:)=u; Vtam=2; plot([0 u(1)],[0 u(2)],'k',[0 u(1)],[0
u(2)],'ok'); hold on; A1=[0 0 u(1) u(2)]; L=[u(1) u(2)]; ltam=2;
[Vtam,V,L,L2,ltam2,A1]=plotaadjacentes(u,N,M,Vtam,V,L,L2,A1);
L=L2; %Passou os dados de L2 para L
clear L2; clear ltam2 L2=[0 0]; for n=2:length(L)/2 -1
[Vtam,V,L,L2,ltam2,A1]=plotaadjacentes([L(2*n-1) L(2*n)],N,M,Vtam,V,L,L2,A1);
end
for cont=1:10
L=L2;
clear L2
clear ltam2
L2=[0 0];
for n=2:length(L)/2 -1
[Vtam,V,L,L2,ltam2,A1]=plotaadjacentes([L(2*n-1) L(2*n)],N,M,Vtam,V,L,L2,A1)
end
end
s=size(A1); for i=1:s
v=converterporiginal([A1(i,1) A1(i,2)],[a b]);
A1(i,5)=v(1); A1(i,6)=v(2);
v=converterporiginal([A1(i,3) A1(i,4)],[a b]);
A1(i,7)=v(1); A1(i,8)=v(2);
end
A1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(2)
L=[0 0]; ltam=0; L2=[0 0]; ltam2=0; clear V; V(1,1)=0; V(1,2)=0;
V(1,:)=[0 0]; Vtam=1;
gaussianoconverter(a,b); %desenha o grafo gaussiano na topologia losangular
hold on;
5.2
Anexo
90
u=converter([-1 0],w); %Vértice imediamente abaixo do 0+0i na topologia losangula
V(2,:)=u; Vtam=2; plot([0 u(1)],[0 u(2)],'k',[0 u(1)],[0
u(2)],'ok'); hold on; A2=[0 0 u(1) u(2)]; L=[u(1) u(2)]; ltam=2;
[Vtam,V,L,L2,ltam2,A2]=plotaadjacentes(u,N,M,Vtam,V,L,L2,A2);
L=L2; %Passou os dados de L2 para L
clear L2; clear ltam2 L2=[0 0]; for n=2:length(L)/2 -1
[Vtam,V,L,L2,ltam2,A2]=plotaadjacentes([L(2*n-1) L(2*n)],N,M,Vtam,V,L,L2,A2);
end
for cont=1:10
L=L2;
clear L2
clear ltam2
L2=[0 0];
for n=2:length(L)/2 -1
[Vtam,V,L,L2,ltam2,A2]=plotaadjacentes([L(2*n-1) L(2*n)],N,M,Vtam,V,L,L2,A2)
end
end
s=size(A2); for i=1:s
v=converterporiginal([A2(i,1) A2(i,2)],[a b]);
A2(i,5)=v(1); A2(i,6)=v(2);
v=converterporiginal([A2(i,3) A2(i,4)],[a b]);
A2(i,7)=v(1); A2(i,8)=v(2);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(3)
L=[0 0]; ltam=0; L2=[0 0]; ltam2=0; clear V; V(1,1)=0; V(1,2)=0;
V(1,:)=[0 0]; Vtam=1;
gaussianoconverter(a,b); %desenha o grafo gaussiano na topologia losangular
hold on;
u=converter([0 1],w); %Vértice imediamente abaixo do 0+0i na topologia losangular
V(2,:)=u; Vtam=2; plot([0 u(1)],[0 u(2)],'k',[0 u(1)],[0
u(2)],'ok'); hold on; A3=[0 0 u(1) u(2)]; L=[u(1) u(2)]; ltam=2;
5.2
Anexo
91
[Vtam,V,L,L2,ltam2,A3]=plotaadjacentes(u,N,M,Vtam,V,L,L2,A3);
L=L2; %Passou os dados de L2 para L
clear L2; clear ltam2 L2=[0 0]; for n=2:length(L)/2 -1
[Vtam,V,L,L2,ltam2,A3]=plotaadjacentes([L(2*n-1) L(2*n)],N,M,Vtam,V,L,L2,A3);
end
for cont=1:10
L=L2;
clear L2
clear ltam2
L2=[0 0];
for n=2:length(L)/2 -1
[Vtam,V,L,L2,ltam2,A3]=plotaadjacentes([L(2*n-1) L(2*n)],N,M,Vtam,V,L,L2,A3)
end
end
s=size(A3); for i=1:s
v=converterporiginal([A3(i,1) A3(i,2)],[a b]);
A3(i,5)=v(1); A3(i,6)=v(2);
v=converterporiginal([A3(i,3) A3(i,4)],[a b]);
A3(i,7)=v(1); A3(i,8)=v(2);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(4)
L=[0 0]; ltam=0; L2=[0 0]; ltam2=0; clear V; V(1,1)=0; V(1,2)=0;
V(1,:)=[0 0]; Vtam=1;
gaussianoconverter(a,b); %desenha o grafo gaussiano na topologia losangular
hold on;
u=converter([1 0],w); %Vértice imediamente abaixo do 0+0i na topologia losangular
V(2,:)=u; Vtam=2; plot([0 u(1)],[0 u(2)],'k',[0 u(1)],[0
u(2)],'ok'); hold on; A4=[0 0 u(1) u(2)]; L=[u(1) u(2)]; ltam=2;
[Vtam,V,L,L2,ltam2,A4]=plotaadjacentes(u,N,M,Vtam,V,L,L2,A4);
L=L2; %Passou os dados de L2 para L
clear L2; clear ltam2 L2=[0 0]; for n=2:length(L)/2 -1
[Vtam,V,L,L2,ltam2,A4]=plotaadjacentes([L(2*n-1) L(2*n)],N,M,Vtam,V,L,L2,A4);
end
5.2
Anexo
92
for cont=1:10
L=L2;
clear L2
clear ltam2
L2=[0 0];
for n=2:length(L)/2 -1
[Vtam,V,L,L2,ltam2,A4]=plotaadjacentes([L(2*n-1) L(2*n)],N,M,Vtam,V,L,L2,A4)
end
end
s=size(A4); for i=1:s
v=converterporiginal([A4(i,1) A4(i,2)],[a b]);
A4(i,5)=v(1); A4(i,6)=v(2);
v=converterporiginal([A4(i,3) A4(i,4)],[a b]);
A4(i,7)=v(1); A4(i,8)=v(2);
end
C1=caminhos(A1,w); C2=caminhos(A2,w); C3=caminhos(A3,w);
C4=caminhos(A4,w);
C1 C2 C3 C4
%disj=disjuntos(C1,C2)
if disjuntos(C1,C2)==1
'A1 e A2 são disjuntos'
end if disjuntos(C1,C3)==1
'A1 e A3 são disjuntos'
end if disjuntos(C1,C4)==1
'A1 e A4 são disjuntos'
end if disjuntos(C2,C3)==1
'A2 e A3 são disjuntos'
end if disjuntos(C2,C4)==1
'A2 e A4 são disjuntos'
end if disjuntos(C3,C4)==1
'A3 e A4 são disjuntos'
end
end
adjacencias
function[M]=adjacencias(w) a=w(1); b=w(2); line=0;
5.2
Anexo
N=a^2+b^2; for i=0:a+b-1
for j=0:a-1
line=line+1;
c=converter([i j],w);
M(line,1)=c(1);
M(line,2)=c(2);
c=converter([i-1 j],w);
M(line,3)=c(1);
M(line,4)=c(2);
c=converter([i j+1],w);
M(line,5)=c(1);
M(line,6)=c(2);
c=converter([i+1 j],w);
M(line,7)=c(1);
M(line,8)=c(2);
c=converter([i j-1],w);
M(line,9)=c(1);
M(line,10)=c(2);
end
end
for i=a:a+b-1
for j=a:b-1
line=line+1;
c=converter([i j],w);
M(line,1)=c(1);
M(line,2)=c(2);
c=converter([i-1 j],w);
M(line,3)=c(1);
M(line,4)=c(2);
c=converter([i j+1],w);
M(line,5)=c(1);
M(line,6)=c(2);
c=converter([i+1 j],w);
M(line,7)=c(1);
M(line,8)=c(2);
c=converter([i j-1],w);
M(line,9)=c(1);
M(line,10)=c(2);
end
end
end
93
5.2
Anexo
94
caminhos
function[C]=caminhos(A,w)
%Esta função tem como resultado uma matriz com todos os caminhos na
%árvore geradora representada por A
%k fornece a posição da matriz C (colunas de C)
d=0; %d fornece a posição da matriz C (linha de C)
s=size(A);
linhas=s(1); %número de linhas da matriz A
sair=0;
for i=0:w(1)+w(2)-1
for j=0:w(1)-1
itemp=i;
jtemp=j;
d=d+1;
k=1;
C(d,2*k-1)=itemp;
C(d,2*k)=jtemp;
k=k+1;
while(sair==0)
for lin=1:linhas
if A(lin,7)==itemp && A(lin,8)==jtemp
C(d,2*k-1)=A(lin,5);
itemp=A(lin,5);
C(d,2*k)=A(lin,6);
jtemp=A(lin,6);
k=k+1;
end
end
if itemp==0 && jtemp==0
sair=1;
end
end
end
end
sair=0;
5.2
Anexo
95
sair=0;
for i=w(1):w(1)+w(2)-1
for j=w(1):w(2)-1
itemp=i;
jtemp=j;
d=d+1;
k=1;
C(d,2*k-1)=itemp;
C(d,2*k)=jtemp;
k=k+1;
while(itemp~=0 && jtemp~=0)
for lin=1:linhas
if A(lin,7)==itemp && A(lin,8)==jtemp
C(d,2*k-1)=A(lin,5);
itemp=A(lin,5);
C(d,2*k)=A(lin,6);
jtemp=A(lin,6);
k=k+1;
end
end
if itemp==0 && jtemp==0
sair=1;
end
end
end
end
sair=0;
end
converter
function[D]=converter(alpha,gerador)
%Converte o elemento alpha em G_gerador para o elemento que possui a
%menor norma dentro da sua classe de equivalência.
%gerador = a+bi (gerador do grafo)
%alpha = c+di (elemento a ser convertido)
a=gerador(1); b=gerador(2); c=alpha(1); d=alpha(2); N=a^2+b^2;
D(1)=real(c+d*i-round((c+d*i)*(a-b*i)/N)*(a+b*i));
5.2
Anexo
96
D(2)=imag(c+d*i-round((c+d*i)*(a-b*i)/N)*(a+b*i)); end
converterporiginal
function[R]=converterporiginal(alpha,gerador)
%Converte o elemento alpha em G_gerador para o elemento que possui a
%menor norma dentro da sua classe de equivalência.
%gerador = a+bi (gerador do grafo)
%alpha = c+di (elemento a ser convertido)
a=gerador(1); b=gerador(2); c=alpha(1); d=alpha(2); N=a^2+b^2;
D(1)=real(c+d*i-round((c+d*i)*(a-b*i)/N)*(a+b*i));
D(2)=imag(c+d*i-round((c+d*i)*(a-b*i)/N)*(a+b*i));
% if norm(D)==norm(alpha)
%
D=alpha;
% end
R=D;
if (D(2)>=a)
R(2)=D(2)-a;
R(1)=D(1)+b;
%'cond 1';
end
if ((D(1)<0) && (D(2)<a))
if D(2)>-(b-a+1)
R(1)=D(1)+a+b;
R(2)=D(2)+b-a;
%'cond 2';
end
if D(2)<-(b-a)
R(1)=D(1)+a;
R(2)=D(2)+b;
%'cond 3 part1';
end
end
if ((D(1)>=0) && (D(2)<0))
R(1)=D(1)+a;
R(2)=D(2)+b;
%'cond 3 part2'
end
end
5.2
Anexo
97
disjuntos
function[disj]=disjuntos(C,D)
%verifica se duas arvores são disjuntas, usando suas matrizes de caminhos
%Retorna disj=1 se forem disjuntos e disj=0 se nao forem.
disj=1; s=size(C); t=size(D);
%verifica se as matrizes tem tamanhos diferentes. Caso positivo, completa
%a menor com zeros para ficar com o mesmo tamanho da maior
if s(2)~=t(2)
if s(2)>t(2)
for int=s(2)-(s(2)-t(2))+1:s(2)
for int2=2:s(1)
D(int2,int)=0;
end
end
end
if t(2)>s(2)
for int=t(2)-(t(2)-s(2))+1:t(2)
for int2=2:s(1)
C(int2,int)=0;
end
end
end
end
sairdowhileprincipal=0; sair2=0; for lin=2:s(1)
k=1;
while(sairdowhileprincipal==0)
k=k+1;
m=2;
itemp = C(lin,2*k-1);
jtemp = C(lin,2*k);
if itemp==0 && jtemp==0
sairdowhileprincipal=1;
sair2=1;
5.2
Anexo
98
end
while(sair2==0)
if itemp==D(lin,2*m-1) && jtemp==D(lin,2*m)
if itemp~=0 || jtemp~=0
disj=0;
sair2=1;
sairdowhileprincipal=1;
end
end
if D(lin,2*m-1)==0 && D(lin,2*m)==0
sair2=1;
end
m=m+1;
end
sair2=0;
end
sairdowhileprincipal=0;
if disj==0
sairdowhileprincipal=1;
end
end
end
gaussianoconverter
function[ ]=gaussianoconverter(a,b)
%Plota num plano bidimensional o grafo gaussiano com parâmetros a e b
%Restrição: 0<= a <=b
close all;
%linhas horizontais inferiores
for k=0:a-1
for m=0:a+b-2
A=converter([m k],[a b]);
B=converter([m+1 k],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'y',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
5.2
Anexo
99
end
%linhas horizontais superiores
for k=a:b-1
for m=a:a+b-2
A=converter([m k],[a b]);
B=converter([m+1 k],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'y',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
end
%linhas verticais do menor quadrado (esquerdo)
for k=0:a-2
for m=0:a-1
A=converter([m k],[a b]);
B=converter([m k+1],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'y',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
end
%linhas verticais do maior quadrado (direito)
for k=0:b-2
for m=a:a+b-1
A=converter([m k],[a b]);
B=converter([m k+1],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'y',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
end
for x=0:b-1
A=converter([x 0],[a b]);
B=converter([x+a b-1],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'y',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
for x=b:a+b-1
A=converter([x 0],[a b]);
B=converter([x-b a-1],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'y',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
5.2
Anexo
100
for y=0:a-1
A=converter([0 y],[a b]);
B=converter([a+b-1 y+b-a],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'y',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
for y=a:b-1
A=converter([a y],[a b]);
B=converter([a+b-1 y-a],[a b]);
plot([A(1) B(1)],[A(2) B(2)],'y',[A(1) B(1)],[A(2) B(2)],'or');
hold on;
end
end
plotaadjacentes
function[Vtam,V,L,L2,ltam2,A]=plotaadjacentes(u,N,M,Vtam,V,L,L2,A)
s=size(A); Atam=s(1);
ltam2=length(L2); for i=1:N
if u(1)==M(i,1) && u(2)==M(i,2)
verifica=1;
for j=1:Vtam
if V(j,1)==M(i,3) && V(j,2)==M(i,4)
verifica=0;
end
end
if verifica==1
plot([u(1) M(i,3)],[u(2) M(i,4)],'k',[u(1) M(i,3)],[u(2) M(i,4)],'ok')
hold on;
A(Atam+1,:)=[u(1) u(2) M(i,3) M(i,4)];
Atam=Atam+1;
L2(ltam2+1)=M(i,3);
L2(ltam2+2)=M(i,4);
ltam2=ltam2+2;
V(Vtam+1,:)=[M(i,3) M(i,4)];
Vtam=Vtam+1;
end
5.2
Anexo
101
verifica=1;
for j=1:Vtam
if V(j,1)==M(i,5) && V(j,2)==M(i,6)
verifica=0;
end
end
if verifica==1
plot([u(1) M(i,5)],[u(2) M(i,6)],'k',[u(1) M(i,5)],[u(2) M(i,6)],'ok');
hold on;
A(Atam+1,:)=[u(1) u(2) M(i,5) M(i,6)];
Atam=Atam+1;
L2(ltam2+1)=M(i,5);
L2(ltam2+2)=M(i,6);
ltam2=ltam2+2;
V(Vtam+1,:)=[M(i,5) M(i,6)];
Vtam=Vtam+1;
end
verifica=1;
for j=1:Vtam
if V(j,1)==M(i,7) && V(j,2)==M(i,8)
verifica=0;
end
end
if verifica==1
plot([u(1) M(i,7)],[u(2) M(i,8)],'k',[u(1) M(i,7)],[u(2) M(i,8)],'ok');
hold on;
A(Atam+1,:)=[u(1) u(2) M(i,7) M(i,8)];
Atam=Atam+1;
L2(ltam2+1)=M(i,7);
L2(ltam2+2)=M(i,8);
ltam2=ltam2+2;
V(Vtam+1,:)=[M(i,7) M(i,8)];
Vtam=Vtam+1;
end
verifica=1;
for j=1:Vtam
if V(j,1)==M(i,9) && V(j,2)==M(i,10)
verifica=0;
end
.0
Anexo
102
end
if verifica==1
plot([u(1) M(i,9)],[u(2) M(i,10)],'k',[u(1) M(i,9)],[u(2) M(i,10)],'ok'
hold on;
A(Atam+1,:)=[u(1) u(2) M(i,9) M(i,10)];
Atam=Atam+1;
L2(ltam2+1)=M(i,9);
L2(ltam2+2)=M(i,10);
ltam2=ltam2+2;
V(Vtam+1,:)=[M(i,9) M(i,10)];
Vtam=Vtam+1;
end
end
end
ltam2=length(L2);
end
Download

Roteamento em Redes Interligadas modeladas por Grafos