NMinimize se come toda la memoria b / c del trabajo simbólico innecesario

El siguiente código es una forma ingenua de encontrar el número mínimo cuyo cuadrado tiene n divisores (el mínimo debe ser su log y x_i las potencias en su factorización prima). Si miro el caso n = 2000 y uso diez variables en lugar de veinte, esto usa alrededor de 600 MB de memoria. Con el valor de n para el que realmente estoy tratando de encontrar la respuesta, necesito alrededor de 20 variables para asegurarme de no perder la solución real, y rápidamente usa toda la memoria disponible y luego intercambi

n=8*10^6;
a = Table[N[Log[Prime[i]]], {i, 20}];
b = Table[Subscript[x, i], {i, 20}];
cond = Fold[And, Product[2 Subscript[x, i] + 1, {i, 20}] > n,
   Table[Subscript[x, i] >= 0, {i, 20}]] && b \[Element] Integers;
NMinimize[{a.b, cond}, b, MaxIterations -> 1000]

esulta que el problema no está relacionado con la programación de enteros, etc. (eliminar la restricción a los enteros no ayuda).

Mi mejor conjetura es que el problema es que Mathematica está desperdiciando toda esa memoria expandiéndoseProduct[2 Subscript[x, i] + 1, {i, 20}]. Si reemplazo el producto con soloProduct[Subscript[x, i],{i,20}] y cambiar las restricciones para ser>= 1 más bien que0 Obtengo resultados sin problemas y sin que el kernel use más de 50 MB de memoria. (Aunque eso preserva la restricción de desigualdad y no cambia la tarea de minimizar la función objetivo, sí arruina el requisito de integralidad: obtengo resultados uniformes, que corresponden a medios enteros en el problema real).

Una persona en StackOverflow tuvo un problema similar; en su caso, tenían una función objetivo que se evaluaba simbólicamente a un costo enorme. Pudieron remediarlo haciendo que la función solo aceptara entradas numéricas, ocultándola efectivamente de la tendencia "Tengo el martillo Expandir [] de Mathematica, y todo parece un clavo". Pero no puede ocultar la restricción detrás de dicha función (Mathematica se quejará de que es una restricción no válida).

¿Alguna idea sobre como arreglar esto

Edit: Sé la respuesta correcta: después de que mi código de Mathematica no funcionó, utilicé AMPL y un solucionador MINLP dedicado para obtenerlo (también bastante rápido). Solo quiero saber cómo puedo esperar poder usar las funciones de optimización no lineal incorporadas de Mathematica en el futuro a pesar de las locuras que parece hacer con mis restricciones cuando las ingreso de la única manera que sé.

Respuestas a la pregunta(2)

Su respuesta a la pregunta