Linguagem dos valores de uma função afim

10

Escreva para a expansão decimal de (sem avanço ). Deixe e ser inteiros, com . Considere o idioma das expansões decimais dos múltiplos de mais uma constante:n¯n0aba>0a

M={ax+b¯xN}

é regular? sem contexto?M

(Contraste com o idioma do gráfico de uma função afim )

Eu acho que isso seria uma boa pergunta para a lição de casa; portanto, as respostas que começam com uma ou duas dicas e explicam não apenas como resolver a questão, mas também como decidir quais técnicas usar serão apreciadas.

Gilles 'SO- parar de ser mau'
fonte
Agora mesmo, percebo que respondi a um caso específico, seguindo a ideia de @vonbrand. DFA que aceita representações decimais de um número natural divisível por 43
Hendrik Jan

Respostas:

9

Muito simples: suponha que os números sejam escritos em decimal (outras bases são tratadas por uma modificação trivial). Construir um DFA, com estados 0, 1, ..., . O estado inicial é 0 e, do estado na entrada, o dígito passa para o estado . O estado de aceitação é (pode ser necessário um ajuste se ).aa1qdb mod a b > a(10q+d)modabmodab>a

vonbrand
fonte
11
Muito bom - muito melhor que o meu!
David Lewis
8

Isso é regular. Vamos primeiro trabalhar em binário, que generalizará para qualquer base> 1. Seja o idioma em questão. Para a = 1, b = 0, obtemosMa,b

M1,0={1,10,11,100,101,...}

que é todas as strings acima de sem zeros à esquerda, o que é regular (construa uma expressão regular para ela).{0,1}

Agora, para qualquer , com b ainda 0, obtemos de multiplicando numericamente por a, ou seja, executando a transformação em cada sequência de . Isso pode ser feito bit a bit por uma sequência de turnos e adições de que dependem dos bits da cadeia fixa . As duas transformações que precisamos são:H um , 0 M 1 , 0 ˉ x¯ um x M um , 0 x ˉ umaMa,0M1,0x¯ax¯Ma,0xa¯

ˉ x ˉ x 0x¯2x¯ que éx¯x¯0

e

x¯2x+x¯

Concatenar um 0 à direita preserva claramente a regularidade. Portanto, temos apenas que provar que a segunda operação preserva a regularidade. A maneira de fazer isso é com um transdutor de estado finito trabalhando em da direita para a esquerda. Esse é o passo mais difícil. Sugiro fazê-lo com um programa de pseudo-código e alguma memória auxiliar finita (como algumas variáveis ​​de bit) em vez de usar estados. Contanto que a memória tenha um tamanho fixo em todas as entradas e você digitalize estritamente da direita para a esquerda, é uma transdução de estado finito e preserva a regularidade.x¯

Finalmente, para obter de , precisamos adicionar numericamente a cada string, mas isso é feito com um transdutor semelhante que depende do número fixo b. M a , 0 b T bMa,bMa,0bTb

Para fazer o mesmo em qualquer base, mostre adicionalmente como realizar a multiplicação com um único dígito nessa base, usando um transdutor que depende de d. Com isso, podemos multiplicar por números de vários dígitos e ainda permanecer nos idiomas regulares. Ou, podemos refiná-lo dizendo que a multiplicação por é apenas uma adição repetida.S d ddSdd

Você queria apenas dicas. Cada uma dessas etapas depende de um teorema / técnica bastante complexo, portanto, provar que essas provas são completas será o trabalho extra.

David Lewis
fonte
Seu FA não recebe como entrada, portanto não vejo como o que você escreve mostra que o idioma atual é regular. Observe que nem todo programa que utiliza memória finita corresponde a FA: é importante que possa passar apenas uma vez e da esquerda para a direita sobre a entrada, considerando todos os símbolos de entrada exatamente uma vez. x¯
Raphael
@ Rafael Você pode ir da direita para a esquerda, se quiser, o que importa é ser consistente. Não consigo encontrar uma falha no esboço de prova de David; invocar transdutores é um pouco menos elementar do que eu imaginava, mas parece válido.
Gilles 'SO- stop be evil'
@Gilles: Primeiro de tudo, ele não explica como a multiplicação intercalam por e adicionando de ao resultado em uma passagem ; ele até reduz a multiplicação de para "uma sequência de turnos e adições de ". Cada turno e adição é bom, mas como fazer a sequência? Em segundo lugar, e mais importante, ele mostra como construir um transdutor que calcula ; isso não imediatamente dar-lhe um FA que aceita . Por exemplo, multiplicar números é fácil, mas fatorar (supostamente) não é. Então você precisa de pelo menos um argumento adicional. b um x ˉ x¯ um x + b Mabax x¯ax+b¯ M
Rafael
Não estou construindo uma FSA. Estou começando com um conjunto facilmente mostrado como regular ( ) e depois transformando todas as strings nele com uma série finita de operações, cada uma das quais preserva a regularidade. Isso requer um número de passes (transdutores). Mas tudo bem, pois a sequência de transdutores e a estrutura de cada um são previamente fixadas com base apenas em e . Cada passagem (transdutor) preserva a regularidade, portanto, não há necessidade de intercalá-las em uma passagem. Sim, não "elementar". Mas construir um FSA de uma só vez, com um passe, seria muito complexo. a bM1,0ab
David Lewis
11
@ Rafael - sim, isso é muito poderoso. De fato, muitas famílias não regulares também são fechadas sob transdutores de estado finito. E você pode usar transdutores como mecanismos de redução, obtendo toda uma teoria da complexidade "estrutural" de linguagens não regulares.
David Lewis
8

Dica 1 : primeiro resolva o problema mais popular "escreva um autômato que reconheça as representações decimais / binárias dos números divisíveis por 3" quando o bit menos significativo aparecer primeiro.

Pergunta intermediária: prove que é regular.{ax+b¯ax+b0xZ}

Dica 2 : O gráfico da função "módulo " é finito. Você pode calculá-lo para cada em que é o conjunto de dígitos e o idioma do seu autômato.a d { 0 , , 9 }(n10n+d)ad{0,,9}

Dica # 3 : agora, substitua com . O que isso muda? Tente usar o fato de que linguagens regulares são estáveis ​​por interseção em vez de criar um autômato ad-hoc . x NxZxN

Dica # 4 : agora supor que é um número primo (de modo que é um campo) e que ainda estamos no caso em que . Agora usamos uma representação em que o primeiro bit é o bit mais significativo . Você pode construir o autômato da mesma maneira?Z / a Z x ZaZ/aZxZ

Dica 5 : você nem sempre precisa criar um autômato para provar que uma linguagem é regular. Como você pode usar os resultados anteriores para provar que é regular? (com o bit mais significativo primeiro)M

jmad
fonte
Fique à vontade para comentar se achar que isso não é apropriado.
Jmad
Dica # 1 é um grande passo. Na dica 4, é importante perceber que e são diferentes. Passar por parece um desvio, você precisa gerenciar o caractere de sinal: por que não permanecer em ? um 10 Z Na{2,5}a10ZN
Gilles 'SO- stop be evil'
@ Gilles: Eu queria dizer quando e , porque é tedioso para reconhecer. umx+b0xZ3x+1234ax+b¯ax+b0xZ3x+1234
Jmad
@ Gilles: Eu acho que a dica 1 é muito legal para ser estragada. Você provavelmente está certo sobre a dica 4.
Jmad
5

Estou seguindo a ideia de @vonbrand:

Dica 1:

Resolva primeiro para . Você pode usar o teorema de Myhill-Nerode .b=0

Definimos a seguinte relação . Esta é obviamente uma relação de equivalência. Além disso, é congruente à direita, pois, se anexarmos um dígito , obteremos . Finalmente, satura , pois é a classe de equivalência . Como possui um número finito de classes, temos pelo Teorema de Myhill-Nerode que ele é regular. A FSA associada é mínima e tem estados.d ˉ xˉ yx¯y¯:xymodadx¯y¯10x+d10y+dmodax¯dy¯dLL[0]a

Dica 2:

Resolva o caso geral, reutilize o autômato induzido pelo caso .b=0

Sabemos que o idioma é regular para . Assim simplesmente tomar a estado FSA para o idioma. Agora vamos construir uma FSA para . Suponha que tenha dígitos. Em seguida, o FSA se ramifica como uma árvore com 10 anos de profundidade e contém todos os caminhos para números com dígitos. Todos os estados que podem ser alcançados com um número que não está no formato estão rejeitando a aceitação. Finalmente, conectamos a parte da árvore da FSA ao autômato , de acordo com o restante da divisão por .b=0aMb=0Lbkkkax+bMa

A.Schulz
fonte
Eu entendo a técnica, mas não os detalhes. A Dica 1 também não está abordando o caso ? Além disso, para o mod 10 eu esperaria 10 estados (não )? a=1a
Jan Hendrik
3

O idioma é regular.

Dica: expulse nove


Ideia de prova

Para e ,a=9b<9

crie um autômato com estados rotulados de a . é o estado inicial e o único estado final é . Do estado , no dígito , faça a transição para o estado .9080bsd(s+d)mod9

Para manipular outros valores de que são coprime com ,a10

agrupe dígitos em pacotes para encontrar algum tal que divida (por exemplo, pegue se porque ).ka10k1k=3a=37999=27×37

Para manipular valores de cujos únicos fatores primos são e ,a25

observe que se trata de um número finito de dígitos no final.

Para generalizar para todos os valores de e ,ab

use o fato de que a união e a interseção de idiomas regulares são regulares, que idiomas finitos são regulares e que os múltiplos de são exatamente os múltiplos de ambos quando e são coprimes.a1a2a1a2

Observe que usamos a técnica que for mais conveniente; as três principais técnicas elementares (expressões regulares, autômatos finitos, propriedades da teoria dos conjuntos) estão representadas nesta prova.


Prova detalhada

Seja com coprime com . Seja e . Por aritmética elementar, os números iguais a módulo são exatamente os números iguais a módulo e módulo , então . Como a interseção de idiomas regulares é regular ea=2p5qaa10M = { ¯ 2 p 5 qM={ax+b¯xZax+b0}M={2p5qx+b¯xZ2p5qx+b0}babab2p5qM{x¯xb}=MM{x¯xb}{x¯xb}é regular porque é o complemento de uma linguagem finita (portanto regular), se e também são regulares, então é regular; e é, portanto, regular, pois é a união dessa linguagem com um conjunto finito. Portanto, para concluir a prova, basta provar que e são regulares.MMM{x¯xb}MMM

Vamos começar com , ou seja, números módulo . Os números inteiros cuja expansão decimal está em são caracterizados por seus últimos dígitos , pois alterar os dígitos à esquerda significa adicionar um múltiplo de que é um múltiplo de . Portanto, onde é o alfabeto de todos os dígitos e é um conjunto finito de palavras de comprimento e é um idioma comum.M2p5qMmax(p,q)10max(p,q)2p5q0M=FFmax(p,q)M=(F)(({0}))

Passamos agora para , ou seja, números módulo onde é coprime com . Se então é o conjunto de expansões decimais de todos os naturais, ou seja, , que é um linguagem regular. Agora assumimos . Seja . Pelo pequeno teorema de Fermat, , ou seja, a divide . Construímos um autômato finito determinístico que reconhecerá seguinte maneira:Maa10a=1MM={0}(({0}))a>1k=a110a11modaa10k10M

  • Os estados são . A primeira parte representa uma posição de dígito e a segunda parte representa um módulo numérico .[0,k1]×[0,10k2]10k1
  • O estado inicial é .(0,0)
  • Existe uma transição rotulada de para se s e .d(i,u)(j,v)vd10i+umod10k1ji+1modk
  • Um estado é final se (observe que divide ).(i,u)ubmodaa10k1

O estado alcançado a partir de uma palavra satisfaz e . Isso pode ser provado por indução sobre a palavra, após as transições no autômato; as transições são calculadas para isso, usando o fato de que . Assim, o autômato reconhece as expansões decimais (permitindo zeros iniciais) dos números da forma com ; Como , o autômato reconhece as expansões decimais dos números iguais a módulo permitindo zeros iniciais, o que é(i,u)x¯i|x¯|modkuxmod10k110k1mod10k1u+y10kubmoda10k1modaba0M . Esta linguagem é assim provada regular. Finalmente, é uma linguagem comum.M=(0M)(({0}))

Para generalizar para bases diferentes de , substitua e acima por todos os fatores primos da base.1025

Prova formal

Deixado como um exercício para o leitor, no seu provador de teoremas favorito.

Gilles 'SO- parar de ser mau'
fonte