Como obter os valores desconhecidos


19

Alguém pode me ajudar com o seguinte problema?

Quero encontrar alguns valores ai,bj (mod N ) em que i=1,2,,K,j=1,2,,K (por exemplo K=6 ), dada uma lista de valores de K2 que correspondem às diferenças aibj(modN) (por exemplo N=251 ), sem conhecer a relação correspondente concreta. Como os valores ai,bj(modN) não são definidos de forma exclusiva, dadas as diferenças aibj(modN) , procuramos por qualquer atribuição válida de valores.

Definitivamente, tentando cada permutação dos números K2 na lista (totalmente K2! Casos possíveis) e resolvendo as equações modulares com ai,bj pois as variáveis ​​são inviáveis.

De fato, esse problema surge em um artigo sobre a análise criptográfica de uma versão anterior do esquema de assinatura da NTRU ( http://eprint.iacr.org/2001/005 ). No entanto, o autor escreveu apenas uma frase "Um algoritmo simples de retorno encontra uma solução ..." (na Seção 3.3) e, portanto, alguém pode dar mais explicações? Além disso, o autor também mencionou que “todo deslocamento circular {((ai+M)modN,(bi+M)modN}i=1K ou uma troca ({(N1bi,N1ai)}i=1K) resulta no mesmo padrão de aibjmodN ”e esta afirmação é útil?


7
Observe que é impossível recuperar ai,bj , pois se você adicionar alguma constante C a todos os números, as diferenças permanecerão as mesmas.
Yuval Filmus

11
@Yuval: Isso já está incluído na última frase da descrição. Eu acho que apenas uma solução é necessária, pois várias podem existir.
Domotorp 18/04

2
@Yuval Desculpe por não apontar que os ai,bj também devem ser tomados como N modulares N. Portanto, não há soluções infinitas.
um convidado

@domotorp Sim, encontrar uma das soluções está OK.
um convidado

11
Talvez o OP possa esclarecer que o ai , bj é usado no módulo N no início do post: talvez no título ou no primeiro parágrafo. Também vale a pena mencionar o problema com a constante CAs duas coisas me confundiram quando comecei a ler.
Juan Bermejo Vega

Respostas:


4

Aqui está uma sugestão, para e . Nos é dada uma lista . Comece pegando um deles, sem perda de generalidade . Sem perda de generalidade , e obtemos o valor de . Agora pegue outro e espere que ele tenha o formato (isso acontece com probabilidade ) e deduza .N = 251 a i - b jK=6N=251um 1 - b 1 b 1 = 0 a 1 um 2 - b 1 5 / 35 = 1 / 7 um doisaibj(modN)a1b1b1=0a1a2b15/35=1/7a2

Nesta fase, sabemos . Nosso próximo objetivo é procurar por para . Para cada candidato , se então também deve estar na lista. Se , a probabilidade de que também esteja na lista é aproximadamente . Portanto, se encontrarmos algum candidato para o qual também esteja na lista, provavelmente . Dessa forma, podemos recuperar com alguma certeza.um 1 - b j j 1 um i - b j i = 1 ( um i - b j ) 1 ) 33 / 251 um ia1,a2,b1a1bjj1aibji=1 i 1 ( a i - b j ) + ( a 2 - a(aibj)+(a2a1)=a2bji1(aibj)+(a2a1)33/251 ( um i - b j ) + ( uma 2 - uma 1 ) i = 1 b 2aibj(aibj)+(a2a1)i=1b2

Nesta fase, sabemos . Da mesma maneira que recuperamos , podemos recuperar com razoável certeza. Podemos recuperar procurando um candidato para o qual e estejam na lista. Como temos mais , nossa probabilidade de falha diminui consideravelmente. Continuamos e encontramos .b 2 a 3 b 3 a i - b j ( a i - b j ) + ( a 2 - aa1,a2,b1,b2b2a3b3aibj( a i - b j ) + ( a 3 - a 1 ) a b 3 , a 4 , b 4(aibj)+(a2a1)(aibj)+(a3a1)ab3,a4,b4,a5,b6,a6,b6

Em qualquer ponto deste algoritmo, podemos ter adivinhado algo errado, e isso acabará resultando em contradição (digamos que em algum momento, não há um bom candidato ). Em seguida, voltamos atrás e tentamos outra possibilidade; se esgotarmos todas as possibilidades, recuaremos novamente e tentaremos outra possibilidade (para um estágio diferente do algoritmo); e assim por diante.aibj

É um bom exercício para programar esse algoritmo - essa é provavelmente a única maneira de entender como implementar o backtracking corretamente. Essa também é a única maneira de saber se esse algoritmo funciona na prática.


Obrigado e também codificarei esse retorno para entender melhor. Talvez o autor desse artigo original tenha usado um método semelhante porque também mencionou "retroceder".
um hóspede de

Desculpe por esquecer de postar meu comentário na sua resposta! Também implementei o método que você sugeriu (em C ++). A conclusão é que seu algoritmo funciona muito bem e uma das soluções pode ser encontrada muito rapidamente (em menos de um segundo no meu PC). E desta vez, eu posso entender melhor os procedimentos de retorno. Muito obrigado!
um hóspede

Por que não posso "@Yuval" no meu último comentário ?! Desculpe, mas eu tentei várias vezes.
um convidado

Talvez você possa compartilhar o código on-line, para que outras pessoas que leem o jornal tenham acesso a ele.
Yuval Filmus

5

Atualização : A descrição abaixo é para um problema diferente (no qual você tem todas as distâncias em pares em um conjunto em vez de distâncias em pares entre dois conjuntos distintos). Vou deixar assim mesmo, pois está intimamente relacionado.

Esse problema é chamado de problema de canal e é um caso especial do problema geral de incorporação do -torus. Também está intimamente relacionado ao problema da rodovia, no qual as diferenças de distâncias são absolutas (e não um número de módulo).d

Não se sabe se o problema da faixa admite um algoritmo de politempo. Existem vários algoritmos de pseudo-poli-tempo para questões relacionadas. A melhor referência (infelizmente uma antiga) é o artigo de Lemke, Skiena e Smith .


11
Eu acho que esse problema é diferente. No problema do anel viário, conhecemos todas as distâncias aos pares, aqui só o conhecemos entre dois pontos que estão em grupos diferentes. Embora isso pareça menos informações, pode de fato ajudar a resolver o problema.
Domotorp 18/04

Ah sim. é um gráfico bipartido. bom ponto.
Suresh Venkat

Gráfico bipartido? Algo como. Talvez eu deva tentar o problema dessa maneira, mas não tenho a linha de pensamento concreta agora.
um hóspede de

3

Aqui está uma observação que eu acho que lhe dá uma posição, possivelmente suficiente para resolver o problema.

Suponha que temos quatro diferenças , , , que surgem como as diferenças entre pares entre dois 's e dois ' s. Chame isso de quarteto de diferenças. Observe que temos um relacionamento não trivial:a 1 - b 2a1b1a1b2a 2 - b 2 a ba2b1a2b2ab

(a1b1)(a1b2)=(a2b1)(a2b2)(modN).

Você pode tentar usar esse relacionamento para identificar quartetos em potencial da lista de . Por exemplo, escolha quatro diferenças fora da lista; se eles não satisfazem o relacionamento acima, então definitivamente não surgem de uma estrutura de quarteto; se eles satisfazem o relacionamento, podem surgir de um quarteto.K2

Existem várias maneiras de tirar as coisas daqui, mas suspeito que isso será suficiente.

Suspeito especialmente que, para seus exemplos de configurações de parâmetros, o problema será muito fácil, porque o teste acima para reconhecer um quarteto provavelmente não terá muitos falsos positivos. De todas as formas de escolher 4 diferenças da lista, haverá quartetos (que satisfarão todos os relacionamentos) e o restante são não quartetos (que satisfazem a relação com probabilidade , heuristicamente). Portanto, esperamos ver cerca de falsos positivos, ou seja, 4-tuplas que passam no teste mesmo que não sejam quartetos. Para seus parâmetros, isso significa que temos 225 quartetos e( K(K24)1/N( ( K2(K2)21/N(58905-225)/251234((K24)(K2)2)/N(58905225)/251234outros falsos positivos; Assim, cerca de metade das quatro tuplas que passam no teste são na verdade quartetos. Isso significa que o teste acima é uma boa maneira de reconhecer quartetos. Depois de reconhecer os quartetos, você pode realmente ir à cidade recuperando a estrutura da lista de diferenças.


@ DW: Obrigado, mas agora estou me perguntando o próximo passo depois que todos os quartetos possíveis (totalmente 225 + 234 = 459) forem encontrados. Deveria procurar três quartetos não sobrepostos e testar se eles podem constituir uma solução possível? Como fazer isso com eficiência? Talvez não seja tão difícil, porque não haverá muitas sobreposições.
um hóspede

@aguest, boa pergunta! Não me lembro do que estava pensando na época. Acho que me lembro de pensar que uma abordagem poderia ser começar com um quarteto e procurar todas as outras que se sobrepõem em duas diferenças (por exemplo, decorrentes de onde ), mas eu não saber para onde ir a partir daí (como filtrar falsos positivos). j 2a1,aj,b1,b2j2
DW

3

Aqui está uma abordagem diferente, baseada na localização iterativa de números que não podem aparecer entre . Chame um conjunto um excesso de aproximação da é se sabemos que . Da mesma forma, é um overapproximation da 's, se sabemos que . Obviamente, quanto menor é, o mais útil desta aproximação é sobre-, e o mesmo se passa com . Minha abordagem baseia-se em refinar iterativamente essas super-aproximações, ou seja, reduzir iterativamente o tamanho desses conjuntos (pois descartamos cada vez mais valores como impossíveis).{a1,,a6}uma { a 1 , ... , um 6 } A B b { b 1 , ... , b 6 } B A BAa{a1,,a6}ABb{b1,,b6}BAB

O núcleo dessa abordagem é um método de refinamento : dada uma super-aproximação para os 's e uma super-aproximação para os ' s, encontre uma nova super-aproximação para os 's de modo que . Em particular, normalmente será menor que , então isso nos permite refinar a super-aproximação para os 's.AaBbAaA * A umAAAAa

Por simetria, essencialmente o mesmo truque nos permitirá refinar nossa super-aproximação para os 's: dada uma super-aproximação para os ' s e uma super-aproximação para os 's, produzirá um novo super-aproximação -proximação para os 's.ba B b B bAaBbBb

Então, deixe-me dizer como fazer o refinamento. Depois, reunirei tudo para obter um algoritmo completo para esse problema. A seguir, denota o multi-conjunto de diferenças, ou seja, ; vamos nos concentrar em encontrar um refinado excesso de aproximação , dado .D = { a i - b jDA A , BD={aibj:1i,j6}AA,B

Como calcular um refinamento. Considere-se uma única diferença . Considere o conjunto . Com base no nosso conhecimento de que é uma super aproximação dos , sabemos que pelo menos um elemento de deve ser um elemento de . Portanto, pode-se tratar cada um dos elementos em como uma "sugestão" para um número de, eventualmente, incluir em . Então, vamos varrer todas as diferenças e, para cada uma, identificar quais números são "sugeridos" por .d + B = { d + y : y B } B b d + B { a 1 , ,dDd+B={d+y:yB}Bbd+Bd + B A d D d{a1,,a6}d+BAdDd

Agora vou observar que o número certamente será sugerido pelo menos 6 vezes durante esse processo. Por quê? Como a diferença está em , e quando a processarmos, será um dos números sugeridos (desde que garantimos que , certamente incluirá ). Da mesma forma, a diferença aparece em algum lugar em e fará com que seja sugerido novamente. Dessa forma, vemos que o valor correto de será sugerido pelo menos seis vezes. O mesmo vale para ea 1 - b 1 D a 1 b 1B ( a 1 - b 1 ) + B a 1 a 1 - b 2 D a 1 a 1 a 2 a 3a1a1b1Da1b1B(a1b1)+Ba1a1b2Da1a1a2a3, e assim por diante.

Portanto, seja o conjunto de números que foram sugeridos pelo menos 6 vezes. Esta é a certeza de ser um excesso de aproximação da 's, com os comentários acima.a aAaa

Como uma optimização, que pode filtrar todas as sugestões que não estão presentes em imediatamente: por outras palavras, pode-se tratar a diferença como sugerindo todos os valores . Isso garante que teremos . Esperamos que seja estritamente menor que ; sem garantias, mas se tudo correr bem, talvez seja.d ( d + B ) Uma Um *Uma Um * UmAd(d+B)AAAAA

Juntando isso, o algoritmo para refinar para produzir é o seguinte:A A,BA

  1. Deixe . Este é o conjunto múltiplo de sugestões.S=dD(d+B)A

  2. Conte quantas vezes cada valor aparece em . Deixe ser o conjunto de valores que aparecem, pelo menos, 6 vezes em . (Isso pode ser implementado de forma eficiente através da construção de um array dos 251 inicialmente, inicialmente todos zero, e cada vez que o número de é sugerido, você incrementa ; no final você varrer procura de elementos cujo valor é 6 ou maior)A S a s a [ s ] aSASasa[s]a

Um método semelhante pode ser construído para refinar para obter . Você coisas basicamente reversa acima e virar alguns sinais: por exemplo, em vez de , você olha para .B d + B - d + AA,BBd+Bd+A

Como calcular uma super-aproximação inicial. Para obter nossa super-aproximação inicial, uma idéia é assumir (wlog) que . Segue-se que cada valor deve aparecer em algum lugar entre , portanto a lista de diferenças pode ser usada como nossa super-aproximação inicial para os 's. Infelizmente, isso não nos dá uma super-aproximação muito útil para os 's.a i D D a bb1=0aiDDab

Uma abordagem melhor é adivinhar, adicionalmente, o valor de um dos 's. Em outras palavras, assumimos (WLOG) que , e usar como o nosso excesso de aproximação inicial dos 's. Então, nós adivinhar qual desses 36 valores é de fato um dos 's, dizem . Isso então nos dá uma super-aproximação para os 's. Usamos essa super-aproximação inicial , depois a refinamos iterativamente até a convergência e testamos se o resultado está correto. Repetimos até 36 vezes, com 36 suposições diferentes em (em média, 6 suposições devem ser suficientes) até encontrarmos uma que funcione.b 1 = 0 A = D um um um um B = um 1 - D b A , B um 1ab1=0A=Daaa1B=a1DbA,Ba1

Um algoritmo completo. Agora podemos ter um algoritmo completo para calcular . Basicamente, derivamos uma super-aproximação inicial para e , depois refinamos iterativamente. A Ba1,,a6,b1,,b6AB

  1. Faça um palpite: para cada , que . Faça o seguinte:a 1 = zzDa1=z

    1. -aproximação inicial: Defina e .B = z - DA=DB=zD

    2. Refinamento iterativo: Aplique repetidamente o seguinte até a convergência:

      • Refine para obter uma nova super-aproximação dos 's.B bA,BBb
      • Refine para obter um novo excesso de aproximação das 's.A aA,BAa
      • Seja e . B : = B A:=AB:=B
    3. Verifique o sucesso: se os conjuntos resultantes tiverem tamanho 6, teste se são uma solução válida para o problema. Se estiverem, pare. Caso contrário, continue com o loop sobre os valores candidatos de .zA,Bz

Análise. Isso vai funcionar? Eventualmente, convergirá para e ou ficará bloqueado sem resolver completamente o problema? A melhor maneira de descobrir é provavelmente testá-lo. No entanto, para seus parâmetros, sim, espero que seja eficaz.A={a1,,a6}B={b1,,b6}

Se usarmos o método # 1, desde quenão são muito grandes, heuristicamente, espero que os tamanhos dos conjuntos diminuam monotonicamente. Considere derivando de . Cada diferença sugerevalores; um deles está correto e o outro pode ser tratado (heuristicamente) como números aleatórios. Se é um número que não aparece entre os 's, qual é a probabilidade de que ele sobreviva à filtragem e seja adicionado a ? Bem, esperamos que ser sugerido sobreA A , B d | B ||A|,|B|AA,Bd|B||B|1xaAa(|B|1)×36/251vezes no total (em média, com desvio padrão sobre a raiz quadrada disso). Se , a probabilidade de um errado sobreviver à filtragem deve ser de cerca de ou mais (usando a aproximação normal para o binômio, com correção de continuidade). (A probabilidade é menor se for menor; por exemplo, para , espero .) Espero que o tamanho de seja aproximadamente , que melhorará estritamente a super aproximação, uma vez que é estritamente menor que. Por exemplo, se , com base nessas heurísticas, espero|B|36xp=0.4|B||B|=30p0.25A| A * | 18 | Um |p(|A|6)+6| Um | = | B | = 36 ||A||A|=|B|=36|A|18 , que é uma grande melhoria em relação a.|A|

Portanto, prevejo que o tempo de execução será muito rápido. Espero que cerca de 3-5 iterações de refinamento sejam suficientes para convergência, normalmente, e cerca de 6 suposições em provavelmente sejam suficientes. Cada operação de refinamento envolve talvez alguns milhares de leituras / gravações de memória, e fazemos isso talvez 20 a 30 vezes. Então, espero que seja muito rápido, para os parâmetros que você especificou. No entanto, a única maneira de descobrir com certeza é experimentá-lo e ver se funciona bem ou não.z


@ DW: Muito obrigado pela sua resposta longa e pelo esforço que você fez para digitar tantas palavras !!! De acordo com sua descrição, seu algoritmo aqui está bastante correto. E eu vou codificá-lo para testar a eficiência agora.
um hóspede de

@ DW: Oi, eu implementei sua descrição em C ++. O algoritmo funciona rapidamente ea etapa de refinamento faz reduzir os tamanhos dos conjuntos originais e . No entanto, a convergência parece não ser tão perfeita. De fato, para cada palpite , os tamanhos finais de e ainda são maiores que 10, de acordo com a minha produção recorde pelo programa. O número mais frequente de elementos existentes quando (e ) não pode ser aprimorado por repetições adicionais de refinamento é 11, mas dificilmente vejo um número abaixo de 10. No entanto, isso tornou o problema solucionável ao tentar cada 6 elementos escolhidos deB z D A B A ABzDABAB
um convidado

@DW: (Cotinued) final e para cada palpite (embora eu não tenha implementado a última etapa no meu PC). A quantidade total de computação será de cerca de , eu estimo. Muito obrigado! B z 2 20ABz220
um hóspede de

Desculpe, mas meu último comentário é muito longo e tenho que dividi-lo em dois.
um hóspede de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.