From 191464a38fbaba719637b9d59604a0ab23266606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Foll=C3=A1th=20J=C3=A1nos?= Date: Fri, 30 May 2014 13:30:45 +0800 Subject: [PATCH] Solved the cjloss deviation problem --- .gitignore | 1 + .pdf | Bin 15xdebug.pdf | Bin 0 -> 10261 bytes 1xdebug.pdf | Bin 0 -> 10207 bytes 2xdebug.pdf | Bin 0 -> 10260 bytes GH | 10 ++ TODO | 30 +----- debug.pdf | Bin 10945 -> 10830 bytes good.pdf | Bin 0 -> 10051 bytes old.pdf | Bin 0 -> 10894 bytes ratio.tmp | 2 +- scale.pdf | Bin 0 -> 10207 bytes src/boundary.cpp | 83 +++++++++++---- src/cjloss.cpp | 8 +- step2.pdf | Bin 0 -> 9936 bytes test/CMakeLists.txt | 4 + test/act_test.cpp | 155 ++++++++++++++++++++++----- test/detprofile.cpp | 248 ++++++++++++++++++++++++++++++++++++++++++++ test/unit_tests.cpp | 72 ++++++++++++- 19 files changed, 533 insertions(+), 80 deletions(-) create mode 100644 .pdf create mode 100644 15xdebug.pdf create mode 100644 1xdebug.pdf create mode 100644 2xdebug.pdf create mode 100644 good.pdf create mode 100644 old.pdf create mode 100644 scale.pdf create mode 100644 step2.pdf create mode 100644 test/detprofile.cpp diff --git a/.gitignore b/.gitignore index 9022cd6..878e537 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,4 @@ doc/ *.lat *.bnd *.plt +*.pdf diff --git a/.pdf b/.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/15xdebug.pdf b/15xdebug.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c050b8c19ca4e170bce2d4919b453b2abfa512f8 GIT binary patch literal 10261 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 literal 0 HcmV?d00001 diff --git a/1xdebug.pdf b/1xdebug.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ef19dbbab028216aa3576a412fc2fb439e2f49b3 GIT binary patch literal 10207 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 YnujOM-Sd~n#i3#%#2g%o+DgR#4=2Dh(EtDd literal 0 HcmV?d00001 diff --git a/GH b/GH index 27d7348..b37cf2d 100644 --- a/GH +++ b/GH @@ -1,3 +1,13 @@ +Utána nézni, hogy eddig milyen eredmények vannak a gauss heurisztikáról? +Alapos kisérleteket végezni, hogy mitől függ, hogy mekkora sugár kell, hogy működjön: +- random lattice-kkel full enumerationt csinálni (olyan alacsony dimenzióban, ahol még működik a dolog) +- fix determináns, véletlen lattice +- kisérletek: + - fix sugár, változó lattice, mekkora a hiba (hiba előjelét is nézni) + - több különböző sugárral elvégezni és hisztogrammokat késziteni + - Hermite faktorok mennyire különböznek? Mennyire függ a hiba a hermite faktortól? + +------------------------------------------- Érvek amik amellett szólnak, hogy a heurisztika számitással van a gond: - Mindkét enumeration algoritmus ugyanazt az eredményt adja. - Már a pruned esetben is ugyanazt adták és hasonló volt az eltérés mint a teljes esetben diff --git a/TODO b/TODO index a6f2e48..cbaa14a 100644 --- a/TODO +++ b/TODO @@ -1,28 +1,8 @@ -+ Bounding function inputot implementálni, hogy gyorsabban lehessen tesztelni (kapcsoló, hogy milyen legyen a kimenet NTL vagy gnuplot) -+ A korlát gyökvonásánál biztositani, hogy felfelé kerekitse double-ra (RR-ben gyököt vonni és azt kerekiteni felfelé double-ra) - + nem, illetve nem úgy működik az RR felfelé kerekités, kézzel kell implementálni double-el is rendesen működik dolog, nem kell kinlódni -+ tesztelni a bounding function-t (BKZ 30, dimenzió 80) - + tesztelni jól kerekitett R-el és kitalálni, hogy miért nem működik - + az egyik hiba az volt, hogy az algoritmus az R_i^2-eket várja én meg az R_i-ket adom meg neki. - + most viszont sokkal tovább fut mint igérte. Lehetséges okok: - + Végtelen ciklusba esett amiatt amit az NTL megpróbál kiküszübülni -nem ez a gond, az NTL-es változat is sokáig fut - + Rosszul számolja a node-ok számát - + paramétereket keresni, ahol az LLL lineáris pruninggal mérhető ideig fut - + tesztadatokat generálni vele és más alacsony success rate-űvel (hogy végig kelljen mennie) leszámolni a node-okat - + összevetni a gyakorlatban tapasztalt node- számot az előrejelzettel - + R_k val kell normalizálni az egyes körökben, de én R_n-el normalizáltam - - először egy robosztus referenciaimplementációt csinálni (pvolandscale függvénybe kitenni a skálázást és a volume számitást) - - Nagyon lassit vele, meg kellene próbálni skálázásal kiváltani - + Valami el van cseszve az enumeration algoritmusban -nem volt - - Implementálni a bázis randomizálást -+ debugolni a node predikálót: - + olyan cjloss lattice-t konstruálni ahol nagyjából egybeesik a gauss heurisztika és a tényleges legrövidebb vektor és azzal letesztelni - továbbra is alulbecsül függetlenül a gaus heuristika pontosságától. - a cjloss lattice-kre valamiért nem megy - + letesztelni random lattice-okkal - azokat is alulbecsli a leszámlálás vége meg elszáll - + tévedés, rosszul implementáltam a random lattice-ket - + utánanézni a gauss heurisztikának, hogy mit írnak róla és annak alapján finomítani a teszteket - + Alaposabban megérteni az enumeration algoritmusát és debugolni - + Ellenőrizni és debugolni a gauss heurisztika számítását (a cjloss lattice-re a grafikonom laposabb volt mint Phongé) -+ a cjlossos tesztprogramból automatikus tesztet irni, - a cjlossossal nem működik és nem is tudom, hogyan lehetne működésre birni (lásd GH) +- Minimális pruning function keresését kikisérletezni: + - tesztelni a gyakorlatban a képletemet állitható kezdőértékkel (dupla és sima random lattice-el is) + - konstans pruninggal megkeresni a megfelelő arányokat az egyes dimenziókban (dupla és sima random lattice-el is) + - több különböző lattice-ra és összehasonlitani + - a random lattice-s tesztprogramból automatikus teszteket irni - node számlálás full (double) - extreme pruning tesztet külön lefuttatni, hogy ha van még valami gond, akkor az itt kiderüljön diff --git a/debug.pdf b/debug.pdf index 0b9d5ab1de84cc11d361e2fc75904983da58bf78..e91520591bc234e65df18c434ec6f39de6321935 100644 GIT binary patch delta 9264 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 diff --git a/good.pdf b/good.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4071baf9ddc4907bb4dd994253bc552c63eeaa9f GIT binary patch literal 10051 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 literal 0 HcmV?d00001 diff --git a/ratio.tmp b/ratio.tmp index 2e8c7a6..ec739bd 100644 --- a/ratio.tmp +++ b/ratio.tmp @@ -1 +1 @@ -3 22 144 700 3005 11883 40502 126184 362750 988043 2381045 5510916 11939329 23671558 45555319 79560409 126235491 192195797 298829270 450540580 637102013 839021320 1094276433 1269535717 1380349197 1469832912 1555795329 1549768249 1453589791 1291319860 1096733132 883994409 727279166 542925664 388830593 279242934 193941217 123415192 75655355 46379468 25107579 13496579 7105497 3606957 1786140 812953 367352 158658 67212 26555 10025 3598 1341 493 159 54 17 2 1 0 \ No newline at end of file +0 0 1 1 3 6 11 18 29 39 64 87 143 182 284 361 543 682 1001 1247 1727 1867 2477 2449 2998 2880 3275 3049 3480 3033 3390 2982 3040 2470 2316 1697 1566 1128 915 629 535 384 297 190 145 93 71 38 23 15 11 6 3 1 0 0 0 0 0 \ No newline at end of file diff --git a/scale.pdf b/scale.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ef19dbbab028216aa3576a412fc2fb439e2f49b3 GIT binary patch literal 10207 zcma)i1z40@*EZ6PG$Jt|jlj$R!_b0sOG^(hzyQ)Mpn!nVB_$;tQVP-~EiED4A>GpO z4|>jd&w0=HUH|u7!wmc0Yp=c6T6;auweDv#t4Yalfw=i`nJc$TE^v7PK!CleHLi#V zfJX^#XX#=E;6p;{xBvivM+RZ*0(V0G+QMAmQgAbSb2zS;7_PI66CCyo*CVAtzprHW zGx5wO`w^=4DGv#-o=uGmdr(?$*Z<+Sche{m4RWuKlCE#LP}m z-k2NR%gLLov#Il$0lTYh@lgF4>QMavp3U^8l3ls#WBM2RGZY8sbIc#+&`vH6mQAi`b@ zCJRg1`JX%{=B@E@cl)3nEU2EY6e-jnR;pL_#b{7Pi)xOu;C=p#UPz|+s%;oO+c~>g zU8Q+@CJux>KJU!6{3w~so=X};>yFn!L^fQZGp!e53f&1oN(LcR>yeVv5&Oye4Vly- zi^Vx?J0wNxFZa>f4Il8gM+dAtrSeS{K&iOWm7Qv zQ`btou$*Y+IMz!7@~l8DZD-yu@D8%7%joM^hSQzs&-T!yF=0v18Gt)CmPRzJf`dc*Lw zq2pF~?fa!;xYpv%`HEDdub=yOhL*<5%QWl74~ zECG`!9kziTU2w~(+g+D5e80hM6ziG#$U7w$b|`1-D3Y0l13@OeGk_x{x}e26zgO58 zCBf#`c2q0-z&vz1o&eaEYOv#2HpQwPRcU$r{tS>&Bz$(* z7Z`P3Ea8Uxb`p_}B?PSJr!n*{ey07I#CrGLf~e55l&f*9!TB}I(=*D;`j!Eny~EAC zc`@+K^?KgG+)1=&^cx1#2OU+6k!B{6N-tZPcPQ*PP06;Ba`3q=9nV-mM?J(lb zR-rT2q%jDcDDN#^XmAzP2r&ws`LOeen#5+ZkS&d$6V}Ij_@7P-wBT)R5T=9{J&1{w zC?wX%FQH7V!q;*yu*6pNxo;AnWa}`p(DLm2#B;vD82r366fC2YQ?GjW`=~%_hhWSe z?B$1h(`~mL7sqk8|_Ce0>xONB5e%P_NVGI%Rwr@jfF2R_rLYvsS;q z-*~2e<}E}=^L{F*K(EID1xIDdXraO@=*R79l$3Yf`9&E8&l*^%;>am>4mhK$Fa>hk zo#pbHaLPTZTCdf5z5SiU*dVr+N3+bLq|A(BA=(45#k&5sZ%Nlmm@i1<@q*KN1Nq3RLrJ%H`4j|0dI+wL(jrAG^)1 zRsan&wENBDOb~HvM(}H&2-42l_WZDxL4#f>!sF=ux}r#ZUx>TG#T9v%U`h1|1`l1P zHxc@(Nyl5WfXITm-D|JdL!AfbZmVYXFDo=axSQovbo#sP>T4|h(#5zGYu!zi2=zZJ*4*JtU!OuASYEVCqNA65FJ@>Q%%MoXB7oO_Hcrt_9W&(Gb7LQ{eMRhD*3$&6_ z5cE!id3pP=PI)@OGr>*?mMghqc`>2Xa;5XT*@xTJ#p2+`NMN?20b&mL)xIWD&9GNj z=@C@usyS>i6oj)R|8iu7#_|o%gVCk#A1)mv#*%S7Q>d(m9Ue-v4BIu$5;2}xj4ZpW zrX3QoXDDz`NiAdgcPcbqw7^LW7CbVD^{!;V@I7Jj{$30m;;$a~1P!6?5dq7XGSaxD z8>SsClCmA&PvW&WCFEURO0D86`1ZCj-m6Gf9Xwb^d9k5s4SpBi+>N)E_Bc5~>1AeC zQqL;s$e~0z)J}S{Pbu0-9NceFh$_? z_w?K8-GV7$qh%n?tDtY(W!kMWPmYmEVms>aqbO0le(}eLUX>v#$#%gK>eRQ^WZ_6< zMbc|uDVLJNbdwYwOiy9h37Nh(nQI{q3B6Y&PuV|G=j_+C4(zZmE=@}220nFxR&>_x_9uwvcyF_>^=XY#_LN3EcMm0(gFH{t@ zdRcW{R%F(q{7ri1VyK2<%LgYhvg;LJ=X@_No5(*y4_!qNgH!7%SWCBvf0hcFJQ~Wm zxA(>#RkQs zXLR@mb#M;kanhX-d1}-m;8TiHA51To>yt9a5B2s0H`@HTCq$%`=->0yn5ll=Fuv*u zdBUff#Ql<HeS!SY!6-yINndb5uC?gzP^672syfj zO~Rb@@o^$liY1II1XVG_E9X0xGQ&L!_a_J=N4v*G*FM*Ot}nl5JaAWF?Vh}1W4MEh zkb8M~+r8TH1_pkYaw0V^6NkZRaiwES-|chqii&g6eb9w*2LW6TW3JXM82MbS3+nN6;xi6 zx@|DrD;w?zidZfG>M&b4lYCE~u83@{7@1a&={UI}4HYrr)lyNp-FTm4B-pu$N02EJ zBOy#=WNi$m(W;xQODs{jk@IdbO1`E|Ol&G6=Ft{NA!Sza~H`O|e(T%sSJuJWt zT1lOtYK?y)A{lx?`MSpc?KzzWPGwp~?1-e|BHQ{!m&q4y>0_MLmzHEJTgW>>e47n? zqlUgP@giM)qS0h07#tKHc#*ERp)zhG9;euvYe?{*jB4@Q0lCw&iqPyOv7oVJ+3BE0 z%ml0FOP5k_LU7(_dhpt&*jr&>E2+xeK0z;~a9PIje%!pop4~sZ%U)%nyH0wyxZ~vy zu;6gBC)By37~1-rSbNJZ3QDH?o96cKrV4k+HXP`J1!_7my1G;QzA(Lkb~3e@q7XYcc?jrl$iOz@rAU zg#VgY4dw(#>H+;Zjz<}8j(|zpdjRy25D>r%0Rq4v2*B`{^kd|lNO5PtZT0uN)RT3x zcXjyNI)3Z_h5l)X269#>n4Po3?ObM_f5MNExD?zCVFp*1mAnQ2FiaipZ13u126qPB zI!XO+b_gKb|5bBB|60iZRCC_C@po|w0ziOZ;6IAcQQa2?n(#640nwABIo|1e7LQV3 zz9_9kciu~Aj+irYy>(*mme$87d-}-$$f4mPtuLWWS=k1Dp_FT3CBt15kX*zG58C=% zbTr}P{#-xyqg(ffoJna9j{(|>XLAEt^LY{dJ7ZC!3ue(t0~GH&a%$|!%L=_2eG!K8v@>eU*3Q${)K zR=F~BByZowsu%d8WF=kS?66C?r5Wu&Nlc?o$*3dU1=5CqM=dQce2lH53ufh4#Vkz3b$fgt*FUw4_qn;d!5L(r*_$+?+?bbhkh;HdoaSZk(gh=2Pamz8oV6qsuz^60R6-r4(I%G+x{cZc-6D-*b87*) zrxad3=%OvV+YBkMjMvw9ws)S0)#OTXAIL-SHaMqO(wyuARfE)5EePwj6y;R9T}k7H zUU8*>X|F`L&?OJEwBSR_tU(#fCvXfZ zI_fn?NswWE_wZ{vo_-j5FU=hbbw9)8!CBI>!Vhl7$%CYThs1g-hf>>~Z%2q_sP1T( zP>A3wnuuDN=?XD@a-r$V{Y0PWYm(N@F+pm3uLNens4?K3Xx8V*q(@rZXfT5P=8eJ7 zsH?9D;mL_{OaFBW8e`knei`VbG>ul&_CAm`k&WoP-saoW1%_hL><_$(47%{yjG4^{ zR}fllbB5Klg7}3PZwT(ZML&miKZ(4;1wVhzND8CB)Wu!#Au==V(arg?)+XYtgZ(=l z1h2pf;B(!WYNp0SXSbHE;mG=*J9VWqC+eVGYYP3$%(luVU-rhIUcz=gVzp+SL)pu6 z5dtw+%F#5c{xK%%6_~xpEZFTGCT^p1)-AL5v;XnrO#*d&=TDJn(nQN&4=>M?rzQ6Y9G zXX?Jk0Ix)OW)J(@^Y>-xYI>`yucN8%e%B>-o;_rY5N}+|A!Rk1bT-hVR#BiZe#7Id z%h7l`#kyD;oe4_Vc7FUS;ShzIXy4S|7(@2GR?)D6Hp}|ReFd+8w5J4^K7JCM?+F)N zQ=>Os*+6!K)yr=%DZ4BrCrT~w0=1YLO%EH3C_;8}_XaGPX$n3AwW(9yOtKlq8G)fp zb&$!Zhs-t&ljZ^6feP&T)nKvv}PJ2JO#>CBC%RSv;xF z&n1Eydx%viN%J^Y^vVKaIb=zoiH$~8@xn&%`o1<5e49^!%J&Uag0r1}WT<_VR(6xd z^?aTUDQx$CJu=InJ$$fKwDfp?x7|2$?JR2GAjey_G1k)Rlgra{{Kw>)kyt!n$Ey<(8{R_7-@$dyjt!)~YkgpRmjkw$Uz<~5@ATVv(a)WdHn z6M6mN)UF;rBQA<0lCm(9tH>_0` zae-`S?%Me4(pZdbhS7~ou(FbVz)SE#)uh#=o2q+$!Co+{-O4|ZoM(C=@8eQtRUwC-5 zijRkt)+pYy1&8bI%3vW(JK*};XK>ljwe;kxlTCFM`1W+N_~+ai-m=1)kC(k^0;*Hm zV!Te~&I$@m)E8O-I(sx{92g~-tcl7o?aA z7NfpFaNOag(J+x~QObnCr+$z;7)B8$iLvAW6&hmh+|>B^?O>QrK|e`5;WIl|oSWz~ zs+_LH_nDbOW26%`d~fD>qMq6^X&BPHZn4azPi(N8nO-}XI`O#(p0K1Z_OA0j4m!gM zz)HXAvFFfVxoj;cXm4*R5bJqOIkpW=PW0dqa3Avtl)lc-E-rGX4H==pA=G#nAN3-O zy|n|&FdwS|s2tE<+tREu*~$_kUgubw9Z*MOZM1TXKGIMiJUBILrbYW*Zw0y?rHiQG z?-bIcSYNPUD{Ea?>8Wa@Ae=kvAhn!@HNiV`uFzKM+|wsHM`y8V3sc-_iSlXav6>O) z0p$5x)?s>O)a5NCW9cK*d_sdWaE+SK4~m{X>;B1I#nMA{S%{~QWlj!u!3eps_C>yd zkuciQipp@|Mi#GZJpE^55gKT+%O6|c9zt(Qa(lk9SrB#r zZOT(xZ_LymT5Kl0%a8l4oEtqP} z^<3L_y3r?#s%N&QC6TJ0VRq#yTGPxowI=w@TXCPgq2@b!H~7)zahI8Co5KMVee7oh zPpe%KUV1dahZhV+4I=4ivhAs8H0Ldd2+-{!)c7|%a52AGv#T6c1XHaWm|)^bJrU7w zk;#9#B1!e*QZfwEO87Zl?=7Df2qF26SQkw-YW3k}#*#P7`p;p1$^uI?7Zctj5P_2% z-kvPC1P^DBcJhPBiKl7Wk1bRZ^j9uc%DlC9UV)s#r`Z#_`5$7P>?L`N%hNS7Pq4*{ z-nF2YB%tXW0Ai_rjWx&few{jwPe057?wh+4UPfu%O(9(5|5m-&MI6z;uQINpL*B4! zUNUGx^~_(E{DA=)Rnk|@Dwwx!xX_h8bMPKvn4L;?E39=TkSF7hAHM39*2&DNxpp7im!uUq`FRa)R(gEsmF(@RqQ2drPQme~iP z%Xc0I$Rt0n6Oz&Bjwf+DF4VG2i0^`bxF;6dQ{jx*snV3Huqbj7XDECX%cRJM3!@$w zn-}`1>2sebbrRu35uSIif)ktn5&7yDNw31dRtI!&ISw@<7u%?h>Y5;Yn!%W*H{3Ss zh`?o$NiIO)jQUKEfaLtGr&7@ZnD!1sYf**Vbpbh7%Y{PyZtnry;<74NXUI!GBfq_V ztKcw*Z&bdk2S*)`f*+UcJRNygD?k^tc&1U`O`}~mfmxiU$HOOr3 ziwoZy*rC}uR(?T%zNf_8q%jy9AAPWK%mwG0p%}p2koOr$yufAWMwx0{1Qlggf zFRUq#4+p>4Y;D55w59RYd#QurOVS)!XSo;ouI!zV+dwlXJ$#?j=ky7M5ydH`A3f%t z`1Yv;>Gjk3blX#U&b>(1JtEY(yq(?B<`PBs!xD0jb-Vi0=d4X^dnYQFsm&+o*V^;; z=x&gOKth2gKv`?}F6Lf+bJcgI^q|Ppd6-{kMErpn>z;0^_fdkcZv`LpwQRrv&(%1`9;LE})ck!^ee_1|JqL_N zihZ9p}iHCy1pa)`t*E^NN*io?HP z=U3;JoUgZ}Lb~GtirCF>rmW(;Y==&l%;RBt8_j=a;hkeC>kiXL434pQ?>xnO!A+iC zIUg@JUB8Y#_s~JZjD5}pRbaF`T>Rv)L){kttN6*1jNkpVd))%q-WE(Htcjbu&8{}# z-l??Tzk!0u2*`C+(+W?Ps5!5d=7)=lFA;u4#nlQXsm*Uu0|LYi%l&UO=R?S=>rrh& zY3s)#d(gSbPvbBW68GfM#2EJW#XhXJcAh&p(re>=AUP%Vi#*>W_QNa2@Ls_8)}8k! zKQ*(~#7*HTlbjdvbH<2|Z2c&fV)jMdj|ew~%R&2%-@ryI3EDM~CE^D7k{3hl5vRD? z%XY$)7BVq2s#*Kai(Ki$3v`Nm`&g)Xb47dWsJmKwbbf(HxoYzj1-R)H;TlVQ-i7`e zy&hG~b;%A+q$(sHd2!vlTdn@29_z|L;bx@ zoL*9>TUcu3b}J~0T&yD^%Q@V;!oNm_W~GCM7t@aS;AQhvSYj%CdBUO>yx65AN?%}- zOUH|vDE4JwnA1TjIXrUDESW$<<5J|9P-)-n<6Kv4)}VbGliwRu(#%0ws1M{wJ0p*1 z2EE15Z{NZt8p{wh)dyOSvXoEE>Y$6!5tC<%(J`2j2z9}(zzd_W$|8jLX@9ZidIZOi z(aMm{m>_HILscG`A`6i5!^Aj7bsbS=RkM**#`t=qo{Q}OKs-^?(y5Mnqa<;+>&pkz zKAHIIn+3F+@0gdR>8CfSQ~Pf)|4q-`@<)HrbA0@Q0)H}Qg8yckK(}<*|Lu5#;kQ1! z03bff{PVOgojYn0Y&k`*qH=e>z{IJi&>orA$~}-`5Z(KU=Qbk$7KooK3O#E4X(F z;d_9hQA{#FcZtrA=g*~|tnDK*=$3}DE6$A#(rRp}M%{PW4LgoRcn*RzqX=VMO>%U* zIdo;m{Itpy#@@J^i+qzktUu2RS&x(h5nvBGvqY zG+f}%v;olH<8K>se>QHdLDHLWFyNK}{W~KH`VWu%C$)Pk{9B)^smm|2_p!XxEqLoJ z@UI?8m^1tq`QN;Q9H8Opj9h`dorV4Fh+7_79d3z0Qrk#}Ngx?)_%B!8@~f&&=5Qy3 zoh5)x-W+Kn!o~BiE)7=)2V3~FTf=`@^*84FKk-63;IG8e0q6sf#4`klB%VP600=MS zfBl0(zyJs`6cD5f_>pme@bUuqkg6cOe8};<0I+}nfS*qgz$*v_7#jYKM82iS|Gj_y z>9Jc^{f@)`&sEZP$iq#y*7N*nJ(t`sUB4r44nsx`>1k)ARlj1T{+meGwAZpj+#ZVp z+}>&a5z&7w@0P3oy=xT_=C_J&>3sFS7FNrW8Le@UII1;pgY&2Ur09zy$dPkg>bH z0Cs<3ynH~UH~xtMfyiy~Ul=bh6zP_K$_erz-)sCA#>@Xdj1~Ad2K^uAh4O)s!TjeO zQ0TwsfI@lyB_{|1{u_hvAs;#a)F&taK|Znm#9W+U$h(5muQPZW2ru}p|87%K-QFI# lC;oFB?>3DAzxKtio#yNUb8`9RaX}~;gv-nKWVvDFvjoQ1lSM9w=?Oj^5)F`c46xEuw z=bN-o`+J_>^Zu{@`@JG@KIcB;UMJW6$zf5KmFEWW2;#FeY*wD(^8ZjXc^P@nctBuo}&;baNJmyp1BMIvBO2Yio=cEh2{%|^n^ zGtP4?m;G91ENL9<2+V6D3f|VzIGc(OpS+-ArrSSKjv#t3GOybbMA6;-2!&mr}0 zvb*2HdCb+t?$G6d8AbW{EkVu z9IxP!59Y2~u5LZr>8jcx66w5XWH~P4|9;8wpncRM=kwsE4{250$+$l|G+ zM$gTRrQ+xOYOr98F3Wpws(aWgGm)!h<(Ewb;m%LvXGIp)E`m49ABb(XTlQk+wQ#IW z=;{Y>X%8udkn6Z?mh+p!qV>25;Jus~->2ExvIf_Q)YS0rP=U*xBg!aJ)3-I_@lKq1 zOnA11&Em+u4RK&)AG0K~CiP}Ej#Wb$N!=!ggbv6*sE3~RhhXctX@4lGsts9II&8M? z#V>1m{2{ff+RMX(=S-#guZ@?Lm&8-)@Re6b*jZZ=$hLgCe5?cJsxB?7 zedwDg_;O&XIsy7r+eq}=u&%zQ>w01+A!qqgY2w=InV#pY%gG9#v8CR2w`n%FxT&5W zk9*nd^|g|)bfb<`hC1y!`HjK7;>R$b4?$E)j(&qZ9`EvFdcX%{^8VW&DS3gXITq<& zd=?*Y(kXw~`e%B3t43+6K~;|C0(UVjs1GAbihvsN=ZVFXMNE|*PVE(C>s%hja7ONT#|T17R!xPh1jSo8ts3I?kZR?{m%1lhnf{8a zvotB0LiBxWQKr^whO?jRepqK^IT;9>ewTFF+hm*LuH&C#I@u>5L10t{@*~q$tHqSh zQmU^6;9<}-Y=(P^z>F`8Simooi?g~3daYEWG_Phhwv*u0i2M~skF*>0w{%TfXx8@T zo{YE85%iBUuR|0AMg;;4h_;ir`kKAiFzpjh3Lm%+ap8$4jH`<&Gaq{e`&jAu)yeK{ zWZtmusRMeVR>EPprw`0vjo%=d%8G3B5wf+lcB)k$5+D@T*drEG&7WA_S9Z@UpO0SO ztN;iozo26gtv7ALdOyijB~Ao8xFyz}O)?}9K;(e448L1L58L!qF#TjoU>w+CNlhw9 zu@$k!C{aYY#uOTn;L<7|o3=}oBK33xJKMi&Eqli^XhdxR=ZJ8||MGA^Z2@X!Vq+er z8nmyQGy~;gWbOLQA|LzG_ZzFt9ak`;JQvTlVXi6*4pl4V*>V({$y;36fet(zlWEA% zyv!U4-FZi5WsUWK1*rvXh25v|gD1z+LfwXkp+RRnIa><1a7t&n8k}_kU5Bvxzu;;e z%ThTt)Qfo)izbvK7Aacy^7BIwUHILuKEcT2bjrrU_|vv@53Kyo#LRmcnCZ$^p{3n!S)lk5pr!H>y+ZXQ7h)2m+x zT1fXMFHc3vz|6r*SKWLnhm<3m4JOYWSd4zKpU_4i?~ zu78=mLu%f)6xf&QkSx&EANXbZ><7#09v5p0y@7BNG1C^06ah;+9++pxu*`86Qjc}W z3-kokq%D1pQ;><$Gm2{}jTT_D>rQ;~V~o?tkZ!&OPwCpcCLze&#nWlrko4|d$wJ#3 zo6W%-J2#jlAKOol296Yj3rTsZ_#!O#5KgT*bAul3Pmsye)qZQI9|r$`BNu~XIeAwxI}4@vF&WFO<)VrzxI9K99BJCt2x@0u#*!1d~e z|7WRoJu^^~p;^V!INq}je%4rdF4iXKG14}SByz|*Jwq{QSR;D^p&>rFi~Y_ZdqS(2 z9v()rW|AF|_bA^MN~ZkzeoB?KkvCL}^v-=k5pzvS<<;s(gTV%viP+PYSuPWNIfb$? zX_+XX5~(c)Wa`!R)vFJen;G7tG#iI~BKfmrc)BIXF`B_*(r+L#S?ucCa5>Ih}5 zzviq?$;jk&N{}$d7q`aHNOyX9hveq5(CvCRVvhP6qYA8z7Yv6TP|vPepW$=-8bh<_ z9=hJOGpc6;G>O;w60r)&e|c*E>^6f&YaHFc2`D7vMsFd4vt~_A%)C5Ew*75{UPi0(4{^05W>=H z6nbt9W@8ANyOZZb;Ys6!P0)}OQ>jlxud1P)k;#u{ao3So1VGQz!*9fwZv!dK2Kt1V z^LMVF><9_k+jM*O;n0F&?_HB0E#$D)uQP|h!wXMu@K;HI?QP)S>QMPrsY7WpxnXNI^$ek(Ip)w+tz=FU^I;H%MC-r@$@kUV%h+V;b3L*z~f1 zeGix-V~N;HU%}kD-jV0%M!Oaxc#&X^A{rgZEXersM@$YDm{^+zx_-g&hrke;mFY$< z7kaZ5LN1Y0L7Ck>{&+{{QK<)aOuA;hEI{^6&M&-mj;;;vz7A6gRkFUW&ne^Sfx+<< z#GI*;OWg9*o)(y$CE5roS78z{#EzEm#YpAIyIY&u1B6>7_$14! zxkolwS|VO{m7fZ!72ZWLO5T6O^$KuWh|0fIk1TDAVj5@NU3Zb=!lm6SYn#&DvzHS7 zeG8_&;&?NK+iex+=s zB5`>jTM?nuQq#b<zHdyf ztgsmQeglUoIVRoaDI$WTVoUuMdEP0oAU>WtJU*U_f=FdDg*p~bWQk2X)UU=yJ2Qf` ztI^Ko$~y-EGY=Q`cfK`=ciFQ#`R%CEZb*3RiDE5Z*l@}bmcZ5dmSc7-Jr%9Z z+UPE4Rokvb&=z17-;oDFa^u30PfRFbcjZ{f*uC1WapVyMJ*+3->l*hvfbYbtnDNu( z7CVG=leAP??tl^GRL@&--pYyj`Ucmp_dW4er-|tEee$I@OsfidKQN^4mMl}7M=NP> z2yf1?z&^=_eV>I~{DK{|%rhPjj*}buZ{kX@(=pnjmL$4fD23FY7A0RjQX{DR+RMit zHCne{_N^M>qJz+2$w3WLPd!T^$plgblG`nwtTkP z>2vqk6CdVi`BxQ!`VU>dpokTT$xv#5}7H^mN**G3hUQ8j&VlWqfNChgrXV%>_wydDXdCIj1 z8#T7V>A0W3Skzu-O?l5)+*rK1rqq=1SlhpV;6iYHs`nD zbojyp7J5lNJ_YnW@GOcD`(gz>;f(!h0>x}r>`AVuJ+U-Je~Eitl?mED|S zwEt*nnr((0@EF}hvfR56Z%^A?^Y(ro+03P{LGEobTFIedK&*wWkSB_ET6B+?kMGIR z=j(n;%$J6?GnJP&C_(k$##IYn!rl2vTe|bt#grsDZNoX)ZC#$vs`{zp#6+igzGaJ8 zCEaTn^LxavUw6WLhx~n|k=7=5bIl6A8|~1|!0~IBD--oTL~imcL~5#vAHGU<_i=tM zr_%SeuU^0HpY3ZtUv5Fvc6xbMHNSfwZ`+X~-NL-@Ri__!$H9q6$QSzA#?8e=tCcCWZiPgF%*e+$9Mj zk+B4&F5=%!un)q^a4HZLi0uGzo(3`{tYC5f>ru1=mECWrXcF9^WNJ5Up+^WtOqk1x;!C>?!iA17d7Z9L30EJNISt68f`IfV5D@~s5 zm#}8TnJU*=XxrPKTWs|onUW41lQsDugzC&6Em&Lfu&cz=f(+h^GJG+0 zdj2FQswaOV-+3%lF*(75k*xN9$*BJNlKv^JOblp93tPKfsT85p993{rpWXE|ZJIrNWgo$1DN&Z*jZ2MX1RQ9b{Euz0pNd3NdkQdyiAq_wAE?Y1O><>$#-ckER9; z0raHh@xuw;EWH7h_X5ny#>Z@j|pWcNqCQBA^EM z*jMm8Wjf*{pBrUpeP=(UIE%P=_2w0P5?=O_ZLh!H`BQ#MQX&-D~P6kn{0=baI$`;UzL%k6-c9 zxMCa^pgQyv+ws}V_eKI1gk@?SmqnC?ip8)6mlebDv>E%{b4U8y>C3NOZiOo!<$Lq{ zP+fMz4+_0p+Y9Dxr)qT*kgSNzY+&$JIqSDUnWxVTbL- zYFX>bih10Snf5hZ2NewS@mp%UeLrS3Yko1mq zoWBKoZ-4Nt&GmYaageI9llcQ$lAF6D&@2wBMXRDDU2Jjb3Y;vW!^WfHv}J>`jDd{X zoYC4pChn2%eO;v{pT2xu3o|r{mUZ;Hh+p2WA)01{A0_UsWlOdwm$uW+>k6;k-g)AVukn~N1@3~&=Rjm*0!esHtqt90C^F+>?6f&s z7>-kQ*Ycx_QOKaOZ2I_OKenAZ$WJxLoPa7a8rE;i#2)oF@>KGRNARuY?+CrMV~t48 z6DnSHBhnn;N-nK2)67PNor*zBzh=y>v6%|s8<0!fn7@RFZzzXX!}AG1GnsCtT^{H6 zF~CI%=~S5ua(ttRs|o1ly-Ty*aVEceSn{%6%S+Bj#ff~*SoF)eZ))nAi0BB+3QR;l z+z+Cut9#G>{^+a1-EJWtT+h^8r{xezA8f71eWPZ4ny{Q>&c`!vS5|8__wPg{&1B7& z(L4#9#i|lcUA1uF+z6xT%`kY&#JW;q4=N)si?p5hD)Y9M!CGLPcWk?DBI@?-2ZJIk z+Mc#+GOBld@*0;H-NP!8P45tJK-x-zuh|nnsF_rN9TPH+roCU@VQQ6>N}-f3i}EX- zd7*CrxjnIrk52cyJw{AABz>sWbpK<`sst+@W<@;_jIz%p2^nT|^{`>qkB%CTL*&6y zxZr1ant<4R4FAR3`?a@i3Iy>}g2>n1ESI#JwL3IpUf)@HNXb6+Iuns<)Vt@*mi^9M zle5d6S#)>$CdncDL>J@v?H@Z~V$zM>MbqJLcZA{b@QYhE!N%&!jSxNZ@;KW9QAI?8 zdykGt*}5m&O!vDux6o;eQNocIT&jU|<>}6DUG6)SNeZ0Bjw_0ZmRE`fWzSZfo>C(o z3h@WT@hQrGcvk71*QuEDwl!~!MNc|S*({kS*L7V}A#$~5?)&v`@5S+;kRZu{r^gQ( z4IaiHy?*v$w-mRUfEvD8@rl-$#qj=gL!FMHu>n_djn%OR&-j9}U1uKS-OP%y%;4hN zG3tipnm5KN8>y!f3O=Ez>zIGzlUPQMXQb~aLVm&$nS02 ztb$LtppKR_`P(l@*`#o^2JgI?l4ajiUR7<68LGbs;>sSoi_NNAAH0?F+1sg5QuJG= zn{UMY6y_`L4=f$8yQFprPBBwI_RMip0_$G~Jg>VN@2&f&FZYVyhg+BRVN>HqUo9SU zIylI&fj(SO!sY&cYGM6T+;t~}ex%bou>}#B@!-1K;OzU4x>P)gTy)8c>F#R7(@x!X zVH)kriA7+ePQNRcE5C0t{jJ4zPreCDcb;P3#p^o#c*Jlt2lZV~J1=5NqBLL^e`tER z>zrhO)j&6qR_u_clhcY(v_h|U&-96bFllKM-QhABq>qkS6sss76T+k0b6@5ChTMLN zb45eKwY=gBss5wexL2}Y&j{dN5eaVe`trJ1Z=z#0&M>>QaG&Q-M3ngET<|j4I&dXP zu@2{bFCbF((2-#iEr7HPl9cesvQVGV9*Q8?B#pc{x%!K$j8Q|yVM}5_XH!|M!V|-`UTKL?E!7nMu z8v9azu}Jz{4cBih*#GwN1JTO?#Cb3DyuB+HempQ#)B25KzMZz!v74Wv`Istzp?Sw0 zQ`<#e~bZd2Uj?y*q}dV)8dx6I1Agwl4NbWLG5 z-tbXfyu|mJ3^_Z*Iqtxpov~l@#+tSt(0#qGd+Hq9m5jYbahyQsj_2c26x~VLmkIXC z!R!@ao(&$kIa@P#pPc%oq4SJuxQ`*W#7phZBP>fg*x7=g`7yH{Yxjzdd ztBJ#x)e4rMfoEq!)4}ws>DL|YxxUa4E%%Ew?}lSIalPt~JD0@}x?yy6tlnX=xGdvB z*KOp^RB3FnYDd=;(g>|gM!Rj>X$hgv2 z-22j0j%lZy(FT5^jLk!GTugY!&^aEDf#lek;luuC8Q-RAqB3k9yz{4BxEIGyx=uDc zB>bu8d7bAGZLuPWm}~gu#E=Jz?U+LkEc6-PHJX)lwPL@!4RH+#ANk%(#d@x9boWZ1 zxaekEq`-n8y>bR5n%&0$bN*|WXkp);=yi(p-Nyl%PMXJB0WaA-%DV1)X)rqvT0T_^ zfAvODM?$|_QKwCA@vSPP29NDVo8sWA(81^9UJnbBkn0rqwC+Kfv961R78b{Zk7-5w z2M0oM%$=jiAKc_3hS=r@#cuS*Gm%M*1u*Ts^$89+o;aWj!YRQlh%7n+#)i}w-`;0OMuqJ;lV;egOQ z)Bo*ved7dGyIvqc$o3_<$m7rih-xR`y1e@vC<`laBiHvUbsB^?B{xMhvOR7QT>tqRA_ z&9wXkD$sjVZ~cj%Tm`p~ZalukQiLQi?W+n>L0hD7qKZwVkRyT}W?MKxq@OH8AnPqr zG%WnsYUzxwsc_|tPMMFbx%yN6yL}Lr+mXa4wIH?y-GS&=12fLg47K+!FsbOWMgHxT zpSJ!@M*{z_ksvhx_nTS!#o(doMOm1u1p@AjbVB@O|IpAwr~`^VRMyv5(^2P?h1o)N z+%!?t-k*MXr~};I6L9ZW7XaPI{;Sg-YV8UT_#=4#7stpA0`dU?+yWp$00;~L0ze?} zZ?aJl3AKk?NIP2F!vMga|jrFGUOgn$OJ~`IAAFQIti4Xk+pH z?70thg`tuEmvvABG(BBWJ5Y4Aazc+lle-!)YdDH8Mj1>RMGM1znhH%?sv#_42)Ls) z;GUu-N<}!*^G}zio3pb$%mJ8Qx1YY3;r8Jhv2_3 zAymfx*I0>r$q5w`Xg~b=o #include #include @@ -36,9 +38,10 @@ double n_full_gsa(double R, double scale, int bsize, int n); double ball_vol(int k, double r); void gen_randlat(mat_ZZ& basis, ZZ determinant, int dim); +ZZ autoscale(mat_ZZ& basis, double Rvec[]); int main(int argc, char** argv) { - int dim, bsize= 2; + int dim, bsize= 20; stringstream ss; ss << argv[1]; @@ -47,16 +50,23 @@ int main(int argc, char** argv) { // cjloss l(dim, 0.94, 10); -// cjloss l(dim, 0.94, time(NULL)); + cjloss l(dim, 0.94, time(NULL)); + BKZ_QP1(l.basis, 0.99, bsize); + + l.basis.SetDims(dim-1,dim); -// cout << "# " << l.basis << endl; +// cout << l.basis << endl; +// return 0; - ZZ determinant; - GenPrime(determinant,dim); + dim--; + +// ZZ determinant; +// GenPrime(determinant,dim); +// GenPrime(determinant,floor(2*dim)); mat_ZZ basis; - gen_randlat(basis,determinant,dim); +// gen_randlat(basis,determinant,dim); - //basis= l.basis; + basis= l.basis; mat_RR mu1; vec_RR c1; @@ -69,31 +79,89 @@ int main(int argc, char** argv) { // Gaussian heuristic double gh= 1; - for(int i= 0; i < mu1.NumRows(); i++) + double* gsghs= new double[dim]; + for(int i= 0; i < mu1.NumRows(); i++) { gh*= c[i]; + gsghs[i]= pow(gh/ball_vol(i+1, 1),1.0/(i+1)); + } gh= pow(gh/ball_vol(dim, 1),1.0/dim); - cout << "# Shortest vector length: " << sqrt(dim-1) << endl; - cout << "# Gaussian heuristic: " << gh << endl; - cout << "# GH/lambda Ratio: " << gh/sqrt(dim-1) << endl; + //cout << "# Shortest vector length: " << sqrt(dim-1) << endl; + //cout << "# Gaussian heuristic: " << gh << endl; + //cout << "# GH/lambda Ratio: " << gh/sqrt(dim-1) << endl; -// Enumeration +// Bounding functions //double R= dim-1; double R= gh*gh; - double* act= new double[dim]; + double* full= new double[dim]; for(int i= 0; i < dim; i++) - act[i]= R; + full[i]= R; + + double* sh= new double[dim]; + for(int i= 0; i < dim/2; i++) + sh[2*i]= sh[2*i+1]= MIN(1,R*sqrt(1.05*2*i/dim)); + if(dim%2==0) + sh[dim-1]= R; + else + sh[dim-2]= sh[dim-1]= R; + + double* linear= new double[dim]; + for(int i= 0; i < dim/2; i++) + linear[2*i]= linear[2*i+1]= 2*(i+1)*R/dim; + if(dim%2==0) + linear[dim-1]= R; + else + linear[dim-2]= linear[dim-1]= R; + + double* step= new double[dim]; + for(int i= 0; i < dim/2; i++) + if(iscale) + conv(scale, sqrt((i+1)/Rvec[i])); + + // conversion computes floor and ceil is needed + scale+= 1; + if(scale == 1) + return scale;*/ + + power2(scale, basis.NumRows()); + + for(int i= 0; i < basis.NumRows(); i++) + for(int j= 0; j < basis.NumCols(); j++) + basis[i][j]*= scale; + + double rscale; + conv(rscale, scale); + rscale*= rscale; + for(int i= 0; i < basis.NumRows(); i++) + Rvec[i]*= rscale; + + return scale; +} void gen_randlat(mat_ZZ& basis, ZZ determinant, int dim) { basis.SetDims(dim, dim); + ZZ s; + s= time(NULL); + SetSeed(s); for(int i= 0; i < dim; i++) { basis[i][0]= RandomBnd(determinant); basis[i][i]= 1; diff --git a/test/detprofile.cpp b/test/detprofile.cpp new file mode 100644 index 0000000..84e7192 --- /dev/null +++ b/test/detprofile.cpp @@ -0,0 +1,248 @@ +/* + Copyright (C) 2014 Janos Follath. + + This file is part of cleanbkz. + + cleanbkz is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cleanbkz is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cleanbkz. If not, see . + +*/ + +#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +double t_extreme_reference(double Rvec[], double b_star_norm[], double t_node, double t_reduc, int n); +double t_extreme(double Rvec[], double b_star_norm[], double t_node, double t_reduc, int n); +double n_full(double R, double b_star_norm[], int n); +double n_full_gsa(double R, double scale, int bsize, int n); +double ball_vol(int k, double r); + +void gen_randlat(mat_ZZ& basis, ZZ determinant, int dim); +ZZ autoscale(mat_ZZ& basis, double Rvec[]); + +int main(int argc, char** argv) { + int dim, bsize= 20; + stringstream ss; + + ss << argv[1]; + ss >> dim; + ss.clear(); + + +// cjloss l(dim, 0.94, 10); +// cjloss l(dim, 0.94, time(NULL)); + +// cout << "# " << l.basis << endl; + + ZZ determinant; +// GenPrime(determinant,dim); + GenPrime(determinant,floor(dim)); + mat_ZZ basis; + gen_randlat(basis,determinant,dim); + + //basis= l.basis; + + mat_RR mu1; + vec_RR c1; + BKZ_QP1(basis, 0.99, bsize); + ComputeGS(basis,mu1,c1); + + double* c= new double[mu1.NumRows()]; + for(int i= 0; i < mu1.NumRows(); i++) + conv(c[i], sqrt(c1[i])); + +// Gaussian heuristic + double gh= 1; + double* gsghs= new double[dim]; + for(int i= 0; i < mu1.NumRows(); i++) { + gh*= c[i]; + gsghs[i]= pow(gh/ball_vol(i+1, 1),1.0/(i+1)); + } + gh= pow(gh/ball_vol(dim, 1),1.0/dim); + //cout << "# Shortest vector length: " << sqrt(dim-1) << endl; + //cout << "# Gaussian heuristic: " << gh << endl; + //cout << "# GH/lambda Ratio: " << gh/sqrt(dim-1) << endl; + +// Bounding functions + //double R= dim-1; + double R= gh*gh; + + double* full= new double[dim]; + for(int i= 0; i < dim; i++) + full[i]= R; + + double* sh= new double[dim]; + for(int i= 0; i < dim/2; i++) + sh[2*i]= sh[2*i+1]= MIN(1,R*sqrt(1.05*2*i/dim)); + if(dim%2==0) + sh[dim-1]= R; + else + sh[dim-2]= sh[dim-1]= R; + + double* linear= new double[dim]; + for(int i= 0; i < dim/2; i++) + linear[2*i]= linear[2*i+1]= 2*(i+1)*R/dim; + if(dim%2==0) + linear[dim-1]= R; + else + linear[dim-2]= linear[dim-1]= R; + + double* step= new double[dim]; + for(int i= 0; i < dim/2; i++) + if(iscale) + conv(scale, sqrt((i+1)/Rvec[i])); + + // conversion computes floor and ceil is needed + scale+= 1; + if(scale == 1) + return scale; + + for(int i= 0; i < basis.NumRows(); i++) + for(int j= 0; j < basis.NumCols(); j++) + basis[i][j]*= scale; + + double rscale; + conv(rscale, scale); + rscale*= rscale; + for(int i= 0; i < basis.NumRows(); i++) + Rvec[i]*= rscale; + + return scale; +} + +void gen_randlat(mat_ZZ& basis, ZZ determinant, int dim) { + basis.SetDims(dim, dim); + + for(int i= 0; i < dim; i++) { + basis[i][0]= RandomBnd(determinant); + basis[i][i]= 1; + } + + basis[0][0]= determinant; +} diff --git a/test/unit_tests.cpp b/test/unit_tests.cpp index 42c14d6..018349e 100644 --- a/test/unit_tests.cpp +++ b/test/unit_tests.cpp @@ -46,7 +46,63 @@ extern RR ball_vol_RR(int k, RR r, int prec); extern RR RR_PI; extern double ball_vol(int k, double r); +extern double integral_even(int ltilde, int l, double tvec[], double vvec[]); + +void genbounds(int l, double* tvec); + int main(int argc, char** argv) { + + double* vols_d= new double[40]; + + bool vinci_test= true; + double vinci_vol_d; + double* bounds_d= new double[40]; + + /*srand ( 0 ); + for(int i= 0; i< 1000; i++) { + genbounds( 30, bounds_d); + if (abs(integral_even(30,30,bounds_d,vols_d)- polytope_volume(vols_d, bounds_d, 30)) > 1e-100) + cout << integral_even(30,30,bounds_d,vols_d)- polytope_volume(vols_d, bounds_d, 30) << endl; + }*/ + + bounds_d[0]= 0.1; bounds_d[1]= 0.2; bounds_d[2]= 0.3; bounds_d[3]= 0.4; bounds_d[4]= 0.5; + vinci_vol_d= 1.08e-04; + if (abs(integral_even(5,5,bounds_d,vols_d)-vinci_vol_d) > 1e-19) { + vinci_test= false; + cout << "\tVinci test FAILED in dimension 5" << endl; + cout << integral_even(5,5,bounds_d,vols_d) << endl; + cout << vinci_vol_d << endl; + } + + bounds_d[0]= 0.1; bounds_d[1]= 0.2; bounds_d[2]= 0.3; bounds_d[3]= 0.4; bounds_d[4]= 0.5; bounds_d[5]= 0.6; + vinci_vol_d= 2.334305555556e-05; + if (abs(integral_even(6,6,bounds_d,vols_d)-vinci_vol_d) > 1e-17) { + vinci_test= false; + cout << "\tVinci test FAILED in dimension 6" << endl; + cout << integral_even(6,6,bounds_d,vols_d) << endl; + cout << vinci_vol_d << endl; + } + + bounds_d[0]= 0.1; bounds_d[1]= 0.2; bounds_d[2]= 0.3; bounds_d[3]= 0.4; bounds_d[4]= 0.5; bounds_d[5]= 0.6; + bounds_d[6]= 0.7; bounds_d[7]= 0.8; bounds_d[8]= 0.9; + vinci_vol_d= 2.755731922399e-07; + if (abs(integral_even(9,9,bounds_d,vols_d)-vinci_vol_d) > 1e-19) { + vinci_test= false; + cout << "\tVinci test FAILED in dimension 9" << endl; + cout << integral_even(9,9,bounds_d,vols_d) << endl; + cout << vinci_vol_d << endl; + } + + bounds_d[0]= 0.1; bounds_d[1]= 0.2; bounds_d[2]= 0.3; bounds_d[3]= 0.4; bounds_d[4]= 0.5; bounds_d[5]= 0.6; + bounds_d[6]= 0.7; bounds_d[7]= 0.8; bounds_d[8]= 0.9; bounds_d[9]= 0.95; + vinci_vol_d= 5.120005762235e-08; + if (abs(integral_even(10,10,bounds_d,vols_d)-vinci_vol_d) > 1e-20) { + vinci_test= false; + cout << "\tVinci test FAILED in dimension 10" << endl; + cout << integral_even(10,10,bounds_d,vols_d) << endl; + cout << vinci_vol_d << endl; + } + RR* vols= new RR[71]; int prec= RR_PRECISION; @@ -55,7 +111,7 @@ int main(int argc, char** argv) { cout << "Testing polytope volume computation:" << endl; - bool vinci_test= true; + vinci_test= true; RR vinci_vol; vinci_vol.SetPrecision(prec); RR* bounds= new RR[15]; @@ -205,3 +261,17 @@ int main(int argc, char** argv) { return 0; } + +void genbounds(int l, double* tvec){ + for(int i= 0; i < l; i++) + tvec[i]= 1.0/(rand()%1000); + + double swap; + for(int i= 0; i < l-1; i++) + for(int j= 0; j < l-i-1; j++) + if (tvec[j] > tvec[j+1]) { + swap= tvec[j]; + tvec[j]= tvec[j+1]; + tvec[j+1]= swap; + } +}