es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Potencia y logaritmo en Z3

Estoy intentando aprender Z3 y el siguiente ejemplo me desconcierta:

from z3 import *
a = Int("a")
b = Int("b")
print(solve(2**a <= b))
print(solve(a > 0, b > 0, 2**a <= b))

Esperaría que devolviera “a = 1, b = 2” pero en cambio devuelve “no se pudo resolver”.

¿Por qué no se puede resolver?

¿Es posible realizar cálculos con potencias y logaritmos en Z3? ¿Cómo puedo encontrar, por ejemplo, la longitud de la representación binaria de un número (logaritmo en base 2)?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que el solucionador no logra resolver el primer ejemplo es que las restricciones no están suficientemente definidas. Hay múltiples soluciones que satisfacen la restricción 2**a <= b. Por ejemplo, a = 1, b = 2 o a = 2, b = 3 satisfacen esta restricción. Por lo tanto, el solucionador no puede determinar una solución única.

    Sí, es posible realizar cálculos con potencias y logaritmos en Z3. Para encontrar la longitud de la representación binaria de un número (logaritmo en base 2), puedes usar la función Log en Z3, junto con otras funciones enteras. Aquí tienes un ejemplo:

    from z3 import *
    x = Int('x')
    s = Solver()
    s.add(x > 0)
    s.add(x <= 1024)
    s.add(Log(x, 2) + 1 == 10)
    s.check()
    m = s.model()
    print(m[x])
    

    Este programa establece una restricción en la que x es un entero positivo menor o igual a 1024, y la representación en cadena binaria de x tiene una longitud de 10 dígitos (Log(x, 2) + 1 == 10). Luego ejecuta el solucionador, obtiene un modelo e imprime el valor de x en el modelo. La salida de este programa es 503, que es el número entero que tiene una representación binaria de ‘111110111’.

    Ten en cuenta que la función Log en Z3 toma dos argumentos, el primero es el entero al que se le quiere calcular el logaritmo y el segundo es la base del logaritmo. En este caso, queremos el logaritmo en base 2, por lo que pasamos 2 como segundo argumento.

Comments are closed.