«Оптимизировать 3-кратный вложенный цикл с заданным набором условий сравнения между переменными цикла» или «оптимизировать нижние/верхние границы»
Для математической задачи я хочу найти решения, которые включают 3 переменных цикла, скажем (e,h,i). У меня есть набор меньших/больших условий для переменных цикла, поэтому есть реальный шанс радикально сократить пространство поиска с -say [1..100,1..100,1..100] , если -скажем- е дано.
Основное условие состоит в том, что на самом деле я работаю с набором из 6 линейных комбинаций e²,h²,i², взятых как многочлены, которые также должны давать квадратное значение, то есть положительное значение. Например, первое условие 2e² - i² = a² , а второе 2e²-h²=b².
----------------------
*ee *hh *ii
----------------------
2 0 -1 = aa
2 -1 0 = bb
-1 1 1 = cc
-2 1 2 = dd
1 0 0 = ee // shown just for completeness
4 -1 -2 = ff
3 -1 -1 = gg
0 1 0 = hh // shown just for completeness
0 0 1 = ii // shown just for completeness
Я пишу ee , hh , ii для простоты записи. Таким образом, из первого условия, чтобы получить положительное значение a² , я должен иметь 2ee > ii , поэтому для значения переменной цикла e я знаю, что верхняя граница для переменной цикла i равна целому числу, близкому к sqrt(2ee).
Вот 6 соответствующих условий:
2ee > ii
2ee > hh
-ee > -hh- ii
-2ee > -hh-2ii
4ee > hh+2ii
3ee > hh+ ii
Наконец, циклическая конструкция должна быть такой, а верхняя граница для e должна быть как можно больше, чтобы работать за приемлемое время (на самом деле это псевдокод!)
for e=1 to 1000; ee=e^2 ; hlb=<some-lower-bound>; hub=<some-upper-bound>;
for h=hlb to hub; hh=h^2 ; ilb=<some-lower-bound>; iub=<some-upper-bound>;
for i=ilb to iub; ii=i^2;
aa=2*ee-ii; if !issquare(aa) then next;
bb=2*ee-hh; if !issquare(bb) then next;
cc= -ee+hh+ii; if !issquare(cc) then next;
<and so on; I expext at least 4 squares in aa,bb,cc,dd,ff,gg>
if condition-is-met then print("one solution:",e,h,i);
next i;
next h;
next e;
Мои вопросы: каковы самые жесткие границы для переменных цикла h и i с учетом e . Я бы больше всего хотел иметь общий анзац для решения такой проблемы.
То, что я нашел до сих пор, комбинируя и агрегируя условия
2ee > ii,hh
hh+ ii > ee
hh+2ii > 2ee
4ee > hh+2ii
3ee > hh+ ii
тогда
12ee > 6ii,6hh
12hh+12ii > 12ee
6hh+12ii > 12ee
12ee > 3hh+6ii
12ee > 4hh+4ii
используя наименьшие верхние границы (в левой части), соответственно, самые большие нижние границы (в правой части), я думаю, что могу упростить
24ee > 6hh+12ii > 12ee > 6hh,6ii, 4hh+4ii
Но тогда я не вижу, как я мог бы упростить это и на самом деле сформулировать hlb,hub,ilb,iub ...