Ao trabalhar com coleções de elementos, como uma lista de strings ou uma lista de tuples, acaba por ser muito dispendioso, em termos de recursos computacionais, pesquisar elementos dentro da coleção ou responder a perguntas como “O item X está presente na nossa coleção?”. No entanto, comparar números é muito mais rápido, e os nossos computadores são altamente otimizados para fazer comparações numéricas (diferentemente de strings ou tuples). Assim, se conseguirmos mapear os dados para um valor numérico, certas operações como encontrar um item ou verificar a sua existência na coleção tornam-se mais eficientes.
A técnica de mapear dados de tamanho arbitrário para dados de tamanho fixo chama-se hashing. O número resultante (hash) funciona como um identificador único dos dados originais. Geralmente, dispõe-se de uma função hash que consegue mapear os dados iniciais para um valor de tamanho fixo (como um número).
No Python, por exemplo, existe a função integrada hash, que converte qualquer objeto imutável num número, normalmente no intervalo . Note que esta função só pode mapear objetos imutáveis: se tentarmos fazer hash de uma lista ou de um dicionário (que são mutáveis e podem ser alterados adicionando ou removendo elementos), vamos obter um erro:
Vamos implementar uma função hash personalizada, chamada h. Ela vai receber um par de inteiros e deve devolver o valor de hash resultante. A função h define-se da seguinte forma:
Isto garante que o valor de hash fica sempre no intervalo [0; 5077).
Entrada
A única linha da entrada contém dois números a e b ( ≤ a, b ≤ ).