
ééã¹ãã¯ãã«ãèšç®ããããã»ã¹
æ ¹æ¬åå
ãã®èšäºã¯ããã·ã¢èªã話ããµããŒãã®Wolfram Mathematicaã°ã«ãŒãã§å°ããããããªãå€ã質åã® 1ã€ã«ç±æ¥ããŠããŸãã ããããããã«å¯Ÿããçãã¯å€§ããæé·ããæçµçã«ã¯èªç«ããç掻ãéãå§ããç¬èªã®åé¡ãããæ±ãå§ããŸããã èšäºã®ã¿ã€ãã«ããæãããªããã«ãã¿ã¹ã¯ã¯éã¿ã¹ãã¯ãã«ã®èšç®ã«å°å¿µããŸãããã€ãŸããé¢æ£æ°åŠãšç·åœ¢ä»£æ°ã«çŽæ¥é¢é£ããŠããŸãã ãŸããWolframèšèªãœãªã¥ãŒã·ã§ã³ã®ãã¢ãè¡ããŸãã åé¡ã®æ¬è³ªã¯éåžžã«åçŽã§ãããšããäºå®ã«ããããããïŒåçŽãªåºæ¬ãã¯ãã«ã®å Žåã¯å®å
šã«é ã®äžã§è§£æ±ºãããŸãïŒãéã¿ã¹ãã¯ãã«ãèŠã€ããããã®ã¢ã«ãŽãªãºã ãæé©åããããã»ã¹ã¯éåžžã«éèŠã§ãã èè
ã¯ããã®èšäºã§æ€èšããåé¡ãšãã®è§£æ±ºæ¹æ³ããWolframã§ã³ã³ãã€ã«ã䞊ååãªã©ã®ææ³ã䜿çšããæ¹æ³ãéåžžã«ãã瀺ããŠãããšèããŠããŸãã ãããã£ãŠãäž»ãªç®æšã¯ãMathematicaã§ã³ãŒããé«éåããå¹æçãªæ¹æ³ã®1ã€ã瀺ãããšã§ãã
åé¡ã®æåã®å£°æãåŒçšããŸãã
aïŒãã¯ãã«ã¯ãåºå®é·Nã®ãããåïŒå€0ãŸãã¯1ïŒã§ããã€ãŸããåèš2 Nåã®ç°ãªããã¯ãã«ãå¯èœã§ãã
bïŒ2ã€ã®ãã¯ãã«ãæ³ãšããå ç®æŒç®ïŒæŒç®xorïŒãå°å
¥ããŸãã2ã€ã®ãã¯ãã«aãšbã§ãåãé·ãNã®ãã¯ãã«a + bãåãåããŸãã
cïŒéåA = {a i | 0â€Kâ€2 Nåã®ãã¯ãã«ããiâ1..K}ã çæãšåŒã³ãŸãïŒã»ããAã®a iãè¿œå ããããšã«ãããform i = 1..K b i a iã®åœ¢åŒã®2 Kãã¯ãã«ãååŸã§ããŸããããã§ãb iã¯0ãŸãã¯1ã§ãã
dïŒãã¯ãã«ã®éã¿ã¯ããã¯ãã«ã®åäœïŒãŒã以å€ïŒãããã®æ°ã§ããã€ãŸããéã¿ã¯0ããNãŸã§ã®èªç¶æ°ã§ãã
ãã¯ãã«ã®ã»ãããšæ°Nã®æå®ããããžã§ãã¬ãŒã¿ãŒã¯ãéã¿ã«ãã£ãŠç°ãªããã¯ãã«ã®æ°ã®ãã¹ãã°ã©ã ïŒã¹ãã¯ãã«ïŒãäœæããå¿
èŠããããŸãã
å
¥åãã©ãŒãããïŒ
åãé·ãã®è¡ã®ã»ããããã®ããã¹ããã¡ã€ã«ãè¡ããšã«1ã€ã®ãã¯ãã«ïŒåºåãæåãªãã®æå0ããã³1ïŒã
åºå圢åŒïŒ
ã¿ãæåã§åºåãããéé/æ°å€ã®ãã¢ãå«ãããã¹ããã¡ã€ã«ã1è¡ã«1ã€ã®ãã¢ããããæ°å€ã®ééå€ã§ãœãŒããããŠããŸãã
æåãœãªã¥ãŒã·ã§ã³
æåã«ãééã¹ãã¯ãã«ãèšç®ããåçãç解ããããã«ãå¿ã®åé¡ã解決ããŠã¿ãŸãããã ãã®ããã«ãæå°é·ã®ãã¯ãã«ã䜿çšããŸãã 次ã«ãä»»æã®æ°ã®ãã¯ãã«ãšä»»æã®æ¬¡å
ã®ã¢ã«ãŽãªãºã ãæ¡åŒµããå¿
èŠããããŸãã ããããã«2ã€ã®èŠçŽ ãæã€2ã€ã®ãã¯ãã«ã®åºåºãäžããŸãïŒ
basis = {{0, 1}, {1, 1}}
ãã¯ãã«ã¯2ã€ãããªããããå¯èœãªãã¹ãŠã®ç·åœ¢çµåãããã³ããã«å¿ããŠãb iã®å€ã®çµã¿åããã¯2 Kã«ãªããŸãïŒKã¯åºåºãã¯ãã«ã®æ°ïŒã 次ã®ç·åœ¢çµåã®ãã¡4ã€ãååŸããŸãã
mod2(0 * {0, 1}, 0 * {1, 1}) = {0, 0} mod2(0 * {0, 1}, 1 * {1, 1}) = {1, 1} mod2(1 * {0, 1}, 0 * {1, 1}) = {0, 1} mod2(1 * {0, 1}, 1 * {1, 1}) = {1, 0}
ããã§ã¯ãã¢ãžã¥ã2å ç®é¢æ°ããã§ã«é©åã«å®çŸ©ãããŠãããšä»®å®ããŠããŸãã 4ã€ã®ãã¯ãã«ãå€æããããããã®æ¬¡å
ã¯2ã«çãããªããŸãã æçµçã«ã¹ãã¯ãã«ãèšç®ããã«ã¯ãçµæã®åãã¯ãã«ã®ãŠãããæ°ãèšç®ããã ãã§ãã
sum({0, 0}) = 0 sum({1, 1}) = 2 sum({0, 1}) = 1 sum({1, 0}) = 1
çµæã®åéã¿ã®ãªã¹ãã®ãšã³ããªæ°ãèšç®ããŸãã ãããŠãã¿ã¹ã¯ã®èŠä»¶ã«å¿ããŠãçµæã¯æ¬¡ã®ããã«ãªããŸãã
{{0, 1}, {1, 2}, {2, 1}}

Wolfram Mathematicaã§ã®åçŽãªã¢ã«ãŽãªãºã ã®å®è£
ããã§ãä»ãå¿ã®äžã§è¡ãããŠããããšã¯ãã¹ãŠãWolframèšèªã䜿çšããŠèšé²ãšèªååãè©Šã¿ãŸãã æåã«ã2ãæ³ãšããå ç®ãå®è¡ããé¢æ°ãäœæããŸãïŒåé¡ã¹ããŒãã¡ã³ãã§è¿°ã¹ãããã«ïŒã
(* *) mod2[b1_Integer, b2_Integer] := Mod[b1 + b2, 2] (* *) mod2[b1_Integer, b2__Integer] := mod2[b1, mod2[b2]] (* - *) Attributes[mod2] := {Listable}
次ã®é¢æ°ã¯ãå
¥åãšããŠãã¯ãã«ã®ãªã¹ããšä¿æ°b iã®ãªã¹ãïŒé·ããåºåºå
ã®ãã¯ãã«ã®æ°ã«çãããã¯ãã«ïŒãåãå¿
èŠããããŸãã åºåºã®èŠçŽ ãšåã次å
ã®ãã¯ãã«ãè¿ãããšã¯ç·åœ¢çµåã§ãã
(* *) combination[basis: {{__Integer}..}, b: {__Integer}] /; Length[basis] == Length[b] := Apply[mod2, Table[basis[[i]] * b[[i]], {i, 1, Length[b]}]]
次ã«ãä¿æ°b iã®ãã¹ãŠã®å¯èœãªã»ããã®ãªã¹ããååŸããå¿
èŠããããŸãã æããã«ããããã®æ°ã¯2 Kã§ãããå¯èœãªãã¹ãŠã®ã»ããã¯ããã€ããªè¡šçŸã§0ãã2 K -1ãŸã§ã®ãã¹ãŠã®æ°ã®åãªãèšé²ã§ãã 次ã«ããã¹ãŠã®å¯èœãªç·åœ¢çµåã®ãªã¹ãã次ã®ããã«ååŸã§ããŸãã
linearCombinations[basis: {{__Integer}..}] := With[{len = Length[basis]}, Table[combination[basis, IntegerDigits[i, 2, len]], {i, 0, 2^len - 1}] ]
äžèšã®é¢æ°ã®çµæã¯ã2 Kãã¯ãã«ã®ãªã¹ãã§ãã ããšã¯ããã®ãªã¹ãã®åãã¯ãã«ã®éã¿ãèšç®ããåéã¿ã®äŒè°ã®æ°ãèšç®ããã ãã§ãã
weightSpectrum[basis: {{__Integer}..}] := Tally[Map[Total, lenearCombination[basis]]];
ãããã©ã®ããã«æ©èœãããã確èªããŸãããã ã©ã³ãã ãã¯ãã«ã®ãªã¹ãããåºåºãäœæããéã¿ã¹ãã¯ãã«ãèšç®ããŸãã
(* *) basis = RandomInteger[{0, 1}, {6, 6}] ws = weightSpectrum[basis] ListPlot[ws, PlotTheme -> "Web"] (* Out[..] := {{0, 0, 1, 1, 1, 0}, {1, 0, 0, 0, 0, 1}, {1, 1, 0, 1, 0, 1}, {1, 0, 0, 1, 1, 0}, {1, 0, 0, 0, 1, 1}, {0, 1, 0, 1, 1, 1}} Out[..]:= {{0, 1}, {4, 15}, {3, 20}, {2, 15}, {1, 6}, {5, 6}, {6, 1}} *)

ããããåãããšãèšç®ããããšãããšãããå€ãã®ãã¯ãã«ã«ã€ããŠã¯ã©ããªããŸããïŒ AbsoluteTiming []é¢æ°ã䜿çšããŠãèšç®æéãåºåºã®ãµã€ãºã«ã©ã®ããã«äŸåãããã確èªããŸãã
basisList = Table[RandomInteger[{0, 1}, {i, 10}], {i, 1, 15}]; timeList = Table[ {Length[basis], First[AbsoluteTiming[weightSpectrum[basis]]]}, {basis, basisList} ]; ListPlot[timeList, PlotTheme -> "Web", Joined -> True]

åãé·ãã®ãã¯ãã«ã«å¯Ÿããèšç®æéã®åºåºã®ãµã€ãºãžã®äŸå
çµæã®ã°ã©ãã§ãããããã«ãèšç®æéã¯ãåºåºã®ãã¯ãã«ã®æ°ãè¿œå ãããšææ°é¢æ°çã«å¢å ããŸãã åãã¯ãã«ã«10åã®èŠçŽ ããã15åã®ãã¯ãã«ã«åºã¥ããŠãã¹ãã¯ãã«ã®èšç®ã¯çŽ10ç§éç¶ããŸãã ãã®ãããªèšç®æéã¯éåžžã«é·ããªããŸãããç·åœ¢çµåã®æ°ã¯åºåºã®ãµã€ãºãšãšãã«ææ°é¢æ°çã«å¢å ãããããã£ãŠåãæ°ã®æäœã®æ°ãå¢å ãããšæ¢ã«èšãããŠãããããããã«ã¯é©ãã¹ãããšã¯ãããŸããã èšç®é床ãäœäžããããã1ã€ã®èŠå ã¯ãã³ãŒããæé©ã§ã¯ãªãããšã§ãã Wolframèšèªã¯ã€ã³ã¿ããªã¿åããã°ã©ãã³ã°èšèªã§ãããããæåã¯ååã«é«éãšã¯èŠãªãããŠããŸãããã€ãŸããæšæºé¢æ°ã§ã¯æ倧ã®ããã©ãŒãã³ã¹ãåŸãããŸããã ãã®åé¡ã解決ããããã«ãã³ã³ãã€ã«ã䜿çšããŸãã
ã³ã³ãã€ã«ãããé¢æ°ã䜿çšãã
ãã®é¢æ°ã®æ§æã¯éåžžã«åçŽã§ã Functionã«éåžžã«äŒŒãŠããŸãã ãã®çµæã Compileã¯åžžã«ããªããžã§ã¯ãããã€ãŸãæ°å€ãŸãã¯æ°å€ã®ãªã¹ãã«é©çšã§ããã³ã³ãã€ã«æžã¿é¢æ°ãè¿ããŸãã ã³ã³ãã€ã«ã¯ãæååãæåããŸãã¯è€åWolframèšèªåŒïŒ Listã§æ§æãããåŒãé€ãïŒã®æäœããµããŒãããŸããã 以äžã¯ãã³ã³ãã€ã«æžã¿é¢æ°ã®äœæäŸã§ãã
cSqr = Compile[{x}, x^2]; cSqr[2.0] (* Out[..] := 4.0 *) cNorm = Compile[{x, y}, Sqrt[x^2 + y^2]]; cNorm[3.0, 4.0] (* Out[..] := 5.0 *) cReIm = Compile[{{z, _Complex}}, {Re[z], Im[z]}]; cReIm[1 + I] (* Out[..] := {1.0, 1.0} *) cSum = Compile[{{list, _Real, 1}}, Module[{s = 0.0}, Do[s += el, {el, list}]; s]]; cSum[{1, 2, 3.0, 4.}] (* Out[..] := 10.0 *)
䜿çšå¯èœãªãã¹ãŠã®ãªãã·ã§ã³ãšè©³çŽ°ãªäŸã¯ãäžèšã®ãªã³ã¯ã®å
¬åŒããã¥ã¡ã³ãã«èšèŒãããŠããŸãã 次ã«ãéã¿ã¹ãã¯ãã«ãèšç®ããããã®é¢æ°ã«çŽæ¥æž¡ããŸãã
ééã¹ãã¯ãã«ã®èšç®ã®ç·šé
åçŽãªå Žåãšåæ§ã«ãããã€ãã®åçŽãªé¢æ°ãäœæããããããé çªã«é©çšããŠçµæãååŸã§ããŸãã ãŸãã1ã€ã®é¢æ°ã®æ¬äœã§ãã¹ãŠã®æäœãå®è¡ã§ããŸãã ãããšå¥ã®æ¹æ³ã®äž¡æ¹ãå®çŸã§ããŸãã å€æ§æ§ã®ããã«ã2çªç®ã®æ¹æ³ã«é²ã¿ãŸãã
cWeightSpectrumSimple = Compile[ {{basis, _Integer, 2}}, Module[ { k = Length[basis], spectrum = Table[0, {i, 0, Last[Dimensions[basis]]}] }, Do[ With[ { (* 2^k - 1 *) weight = Total[Mod[Total[IntegerDigits[b, 2, k] * basis], 2]] + 1 }, (* spectrum . weight - 1 , . spectrum . , . *) spectrum[[weight]] = spectrum[[weight]] + 1 ], {b, 0, 2^k - 1} ]; Return[Transpose[{Range[0, Last[Dimensions[basis]]], spectrum}]] ] ]
ãã€ãã®ããã«ããã®é¢æ°ã®æ£ããåäœã®å°ããªãã¹ããå®æœããŸãã åæ§ã«ã2ã15åã®ãã¯ãã«ã®ãµã€ãºãæã€ã©ã³ãã ãªããŒã¹ã®ãªã¹ããååŸããŸããåãã¯ãã«ã¯10åã®èŠçŽ ã§æ§æãããéã¿ã¹ãã¯ãã«ãèšç®ãããæéãèšç®ããŸãã
basisList = Table[RandomInteger[{0, 1}, {i, 10}], {i, 2, 15}]; timeList=Table[{Length[basis],First[AbsoluteTiming[cWeightSpectrumSimple[basis]]]},{basis,basisList}]; ListLinePlot[timeList, PlotTheme -> "Web"]

æåŸã®ã°ã©ããããããããã«ãåã®éšåã®çµæãšã®éãã¯éåžžã«å€§ããã§ãã æçµæ®µéã§ã®æé©ãªééèšç®ãšã³ã³ãã€ã«ã®äœ¿çšãšãã圢ã§ã¢ã«ãŽãªãºã ãå°ãæé©åãããšã200åã®å éãåŸãããŸãã ãã®çµæã¯ãäžæ¹ã§ãMathematicaãæ£ãã䜿çšãããŠããå Žåãããªãé«éãªèšèªãšããŠè¡šç€ºãããããäžæ¹ã§ã¯ãé¢æ°ã®å
éšåäœã®è€éããç¥ããªãå Žåããã®è§£éå¯èœæ§ã®ããã«Mathematicaãäœéèšèªã§ããããšãããäžåºŠèšŒæãããšããç¹ã§èå³æ·±ãã§ã
ã°ã¬ãŒã³ãŒã
ã°ã¬ã€ã³ãŒãã«ã€ããŠ
åé¡ã解決ããæ¹æ³ãèããªãããç°¡åãªèããçãŸããŸããã b iã®æ¬¡ã®å€ãçªç¶ãŒãã«ãªã£ãå Žåãåºåºãã¯ãã«ã«ãã®æ°å€ãæããŠå ç®ããå¿
èŠã¯ãããŸããã ãŒãå€ã§ä¹ç®ããããããã®ãã¯ãã«ã¯ãçµæãå€æŽããŸããã æåã¯ãã°ãããèãã®ããã«æããããããŸããã£ãã 確ãã«ããªã¹ãb iã®èŠçŽ ã®åæäžã«ããã¯ã¿ãŒã®è¿œå æäœã¯åçŽã«åºãŠããŸããã ãã®åŸã次ã®ã¢ã€ãã¢ãçãŸããŸããã ç·åœ¢çµåãèšç®ãããšãã«ãã¯ãã«ãæžç®ããã³è¿œå ããããšãåãã§ãã ããã¯ã以äžãå®è¡å¯èœã§ããããšãæå³ããŸãã
1 * {0, 1} + 0 * {1, 0} + 1 * {1, 1} == {0, 1} + {1, 1} {0, 1} + {1, 1} == {1, 0} -> {1, 0} + {1, 1} == {0, 1}
ã€ãŸããå°èšã«ãã¯ãã«ãè¿œå ããŠããæžç®ãšåãã§ãã ãããŠããã¹ãŠãçŽ æŽãããã¢ã€ãã¢ã«ãªããŸããïŒ ãªã¹ãb iã®ãµã€ã¯ã«ã§ã b kãšb k + 1ã®è¡šçŸã®éããã»ãã®æ°ãããã§ããããšãçªç¶å€æããå Žåã¯ã©ãã§ããããã 次ã«ãçªå·kã®ç·åœ¢çµåãååŸããã€ã³ããã¯ã¹ãkãšk + 1ã®éã®ç°ãªããããã®çªå·ãšäžèŽããåºåºãã¯ãã«ã®ã¿ã«è¿œå ããŸãã çµæã¯k + 1ã®ç·åœ¢çµåã§ãã ããããããã«å
ã«é²ããšã©ããªããŸããïŒ çªç¶ãé£æ¥ããç·åœ¢çµåã®éãããã£ã1ã€ã®ãã¯ãã«ã§ããããšãããããŸããã 0ãã2 N -1ã®çŽæ¥ã·ãŒã±ã³ã¹ãäœæããå Žåãããã¯äžå¯èœã§ãã ãããããããã®æ°å€ãä»ã®é åºã§çµã¿åãããŠé
眮ã§ãããšãããã©ãã§ããããïŒ ãããå€æããããã«ãããã¯ã°ã¬ã€ã³ãŒããšåŒã°ããŸã-é£äººã®éã®å·®ã1ã€ã®ã«ããŽãªãŒã«ãããªãæ°åã®ã·ãŒã±ã³ã¹ã ãŠã£ãããã£ã¢ã«ã¯ãç¡æ°ã®ã³ãŒãã®1ã€ã§ããã°ã¬ãŒãã©ãŒã³ãŒããšãã®ååŸæ¹æ³ãèšèŒãããŠããŸãã 以äžã¯ããã®ãããªã·ãŒã±ã³ã¹ã®äŸã§ãã
å°æ° | ãã€ã㪠| ç°è² | 10é²æ°ãšããŠã®ç°è² |
---|
0 | 000 | 000 | 0 |
1 | 001 | 001 | 1 |
2 | 010 | 011 | 3 |
3 | 011 | 010 | 2 |
4 | 100 | 110 | 6 |
5 | 101 | 111 | 7 |
6 | 110 | 101 | 5 |
7 | 111 | 100 | 4 |
ã³ã³ãã€ã«æžã¿é¢æ°ã§äœ¿çš
ã³ã³ãã€ã«ã䜿çšãããšããã§ã«éã¿ã¹ãã¯ãã«ã®èšç®ã倧å¹
ã«é«éåãããŠããŸãã次ã«ãã°ã¬ãŒã³ãŒãã䜿çšããŠç·åœ¢çµåãã¯ãã«ã®è¿œå ãæé©åããŠã¿ãŸãããã åã¹ãããã§å€æŽããããããã®äœçœ®ãèšç®ããæ¹æ³ãç解ããå¿
èŠããããŸãã 幞ããªããšã«ããã®æ¬ã®ç¬¬13ç« ãå©ãã«ãªããŸããã ç·åœ¢çµåå
šäœã¯ãæåã«1åã ãã«ãŠã³ãããå¿
èŠããããŸãã ãã ããæåã®ç·åœ¢çµåããŒãã®ã»ããã§ããããšã¯ç¢ºãã«ããã£ãŠãããããããã¯å¿
èŠãããŸããã äžèšã«åºã¥ããŠãééã¹ãã¯ãã«ãèšç®ããããã®ããã«æé©åãããé¢æ°ãäœæã§ããŸãã
WeightSpectrumLinearSubspaceGrayCodeEasy = Compile[{{basevectors, _Integer, 2}}, Module[{ n = Dimensions[basevectors][[-1]], k = Length[basevectors], s = Table[0, {n + 1}], currentVector = Table[0, {n}], (* {0, 0, ..}*) m = 0, l = 0 }, (* , 0 1 *) s[[1]] = 1; Do[ (* *) m = Log2[BitAnd[-1 - b, b + 1]] + 1; (* , *) currentVector = BitXor[currentVector, basevectors[[m]]]; (* *) l = Total[currentVector] + 1; s[[l]] = s[[l]] + 1, {b, 0, 2^k - 2} ]; (* Return *) s ], (* , *) RuntimeOptions -> "Speed", (*CompilationTarget -> "C",*) CompilationOptions -> {"ExpressionOptimization" -> True} ];
次å
512ã®16åã®ãã¯ãã«ã®åºåºã®çµæã®äŸã次ã«ç€ºããŸãã
basis = RandomInteger[{0, 1}, {16, 512}]; ListPlot[WeightSpectrumLinearSubspaceGrayCodeEasy[basis], PlotTheme -> "Web", PlotRange -> All, Filling -> Bottom]

ãã®çµæãéã¿ã®1次å
ãªã¹ããè¿ãããŸãã ãã®çš®ã®ãªã¹ãã¯ãåã®éšåããç°¡åã«è¡šç€ºã§ãããããéåžžã«æ£ç¢ºã§ãã æåã®èŠçŽ ã¯ããŒãã®éã¿ãã¯ãã«ã®åºçŸé »åºŠã«å¯Ÿå¿ããŸãã åŸè
ã¯ããŠãããã®ãã¯ãã«ã®çºçé »åºŠã§ãã åãã³ãŒãã䜿çšããŠããã©ãŒãã³ã¹ããã¹ãããŸãã
basisList = Table[RandomInteger[{0, 1}, {i, 10}], {i, 2, 15}]; timeList=Table[{Length[basis],First[AbsoluteTiming[WeightSpectrumLinearSubspaceGrayCodeEasy[basis]]]},{basis,basisList}]; ListLinePlot[timeList, PlotTheme -> "Web"]

åºåºã®ãµã€ãºããã®èšç®æé
ãã®çµæã15åã®ãã¯ãã«ã®ãªã¹ãã®æåŸã®ããŒã¹ã§ã¯ãèšç®é床ãããã«5åã«å¢å ããŸããã ããããããã¯å°ã誀解ãæãçµæã§ãã å¹çãã©ãã ãæ¹åãããããç解ããã«ã¯ãæåŸã®2ã€ã®é¢æ°ã®èšç®æéã®æ¯çãèšç®ããå¿
èŠããããŸãã
basisList = Table[RandomInteger[{0, 1}, {i, 10}], {i, 2, 20}]; timeList=Table[{ Length[basis], First[RepeatedTiming[cWeightSpectrumSimple[basis]]] / First[RepeatedTiming[WeightSpectrumLinearSubspaceGrayCodeEasy[basis]]] }, {basis,basisList} ]; ListLinePlot[timeList, PlotTheme -> "Web"]

ã°ã¬ã€ã³ãŒãã䜿çšããå Žåãšäœ¿çšããªãå Žåã®ã¹ãã¯ãã«èšç®ã®æéã®æ¯ç
ãã®ã°ã©ããããå®éã«ãã®ã¢ã«ãŽãªãºã ãèšç®ã®è€éãã1床åæžããããšãæããã«ãªããŸãã ãããŠãããã¯åºåºã®ãã¯ãã«ã®æ¬¡å
ã倧ããã»ã©é¡èã§å¹æçã§ãã åºåºã128次å
ã®ãã¯ãã«ã§æ§æãããå Žåã®çµæã¯æ¬¡ã®ãšããã§ãã

䞊åå
Mathematicaã§äœãã䞊è¡ããŠèšç®ããæ¹æ³
Mathematicaã«ã¯ãç°ãªãã³ã¢ã§éåæèšç®ãå®è¡ã§ããå°ããªé¢æ°ã»ããããããŸãã ä»ã ãçšèªã§å®çŸ©ããå¿
èŠããããŸãã çµå±ãå®è¡äžã®ããã»ã¹ã¯ãMathematicaã®ä»®æ³ãã·ã³ã«äŒŒããã®ã§ãããã«ãŒãã«ãšãåŒã°ããŸãã ã«ãŒãã«ã æ°åŠã®äžæ žã¯ãã€ã³ã¿ããªã¿ã¢ãŒãã§åäœããã€ã³ã¿ã©ã¯ãã£ãã©ã³ã¿ã€ã ã§ãã åã³ã¢ã¯ãã·ã¹ãã å
ã®1ã€ã®ããã»ã¹ã§ããå¿
èŠããããŸãã éåžžã®æå³ã§ã®èšèªã¯ãããŒãå®çŸããŸããã ãããã£ãŠãæšæºäœ¿çšã®ã³ã¢ã«ã¯å
±æã¡ã¢ãªããªãããšãç解ããå¿
èŠããããŸãã åºæ¬çã«ããã®ã¿ã€ãã®ãã¹ãŠã®é¢æ°ã¯Parallelã§å§ãŸããŸãã éåæçã«äœããã«ãŠã³ãããæãç°¡åãªæ¹æ³ïŒ
ParallelTable[i^2,{i, 1, 10}] (*Out[..] := {1, 4, 9, 16, 25, 36, 49, 64, 81, 100}*)
å€ãã®æ©èœãåæ§ã«æ©èœããŸãã
ParallelMap ã ParallelDo ã ParallelProduct ã ParallelSum ã...
ãããå®éã«è€æ°ã®ã³ã¢ã§å®è¡ãããããšã確èªããã«ã¯ãããã€ãã®æ¹æ³ããããŸãã ããã¯ãå®è¡äžã®ãã¹ãŠã®ã«ãŒãã«ãååŸããæ¹æ³ã§ãã
Kernels[] (* Out[..] := {"KernelObject"[1, "local"], ... , "KernelObject"[N, "local"]} *)
ãªã¹ãã«ã¯ãçŸåšå®è¡äžã®ãã¹ãŠã®ããã»ã¹ãå«ãŸããŸãã åæã«ãã¿ã¹ã¯ãããŒãžã£ãŒã«ã衚瀺ãããå¿
èŠããããŸãã

6ã€ã®ããã»ã¹ã®ãã¡2ã€ãå®è¡äžã®ã»ãã·ã§ã³ãæ
åœããæ®ãã¯äžŠåã³ã³ãã¥ãŒãã£ã³ã°ã«äœ¿çšãããããŒã«ã«ã«ãŒãã«ã§ãã ãã®å Žåãããã©ã«ãã§ã¯ãããŒã«ã«Mathematicaã³ã¢ã®æ°ã¯ç©çããã»ããµã³ã¢ã®æ°ãšäžèŽããŸãã ããããã ãã倧ããªæ°ãäœæããããšãæ°ã«ããŸããã ããã¯LaunchKernels [n]ã䜿çšããŠè¡ãããŸãã ãã®çµæã è¿œå ã® nåã®ã³ã¢ãèµ·åãããŸãã ãŸããå©çšå¯èœãªããã»ããµã³ã¢ã®æ°ã¯ã $ KernelCountå€æ°ã§ç¢ºèªã§ããŸãã
æåã«ãªã¹ããããé¢æ°ã¯ãããã»ã¹éã§ã¿ã¹ã¯ãèªåçã«åæ£ããŸãã ãã ããç¹å®ã®ã«ãŒãã«ã§å®è¡ããã³ãŒããåå¥ã«éä¿¡ããæ¹æ³ããããŸãã ããã¯ParallelEvaluate + ParallelSubmitã䜿çšããŠè¡ãããŸãã
ParallelEvaluate[$KernelID, Kernels[][[1 ;; 4 ;; 2]]] (* Out[..] := {1, 3}*)
ãã®äžé£ã®é¢æ°ã¯ãéã¿ã¹ãã¯ãã«ã®èšç®ã¿ã¹ã¯ã䞊ååããã®ã«ååã§ãã
ã¡ã€ã³ãµã€ã¯ã«ã®ããŒããžã®åé¢
èšç®ãå®éã«äžŠè¡ããŠè¡ããããã©ããã確èªããŸãã 4ã€ã®ç©çã³ã¢ã®å Žåãããã¯4ã€ã®ã³ã¢ãã¹ãŠã®èšç®ã«1ã€ã®ã³ã¢ãšåãæéããããããšãæå³ããŸãã
basis = RandomInteger[{0, 1}, {24, 24}]; AbsoluteTiming[WeightSpectrumLinearSubspaceGrayCodeEasy[basis];][[1]] AbsoluteTiming[ParallelEvaluate[WeightSpectrumLinearSubspaceGrayCodeEasy[basis]];][[1]] (* Out[..] := 6.518... Out[..] := 8.790...*)
æéå·®ã¯ãããŸããã4åã§ã¯ãããŸããã ããã§ããã¹ãŠãããŸããããŸããã 次ã®ã¹ãããã¯ãã¿ã¹ã¯ãããã€ãã®éšåã«åå²ããæ¹æ³ãç解ããããšã§ãã æãè«ççã§å¹æçãªã®ã¯ãåã³ã¢ã§ç·åœ¢çµåã®äžéšã®ã¿ãèšç®ããããšã§ãã ã€ãŸããçµæãšããŠãåã³ã¢ã¯éšåçãªã¹ãã¯ãã«ãè¿ããŸãã ãããããªã¹ãb iãåå²ããæ¹æ³ã çµå±ã®ãšãããããã¯çŽæ¥çãªã·ãŒã±ã³ã¹ã§ã¯ãããŸããïŒ ãã®å Žåãã€ã³ããã¯ã¹ããšã«ã°ã¬ã€ã³ãŒãã·ãŒã±ã³ã¹ããå€ãèšç®ããé¢æ°ãå¿
èŠã§ãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
grayNum[basis_List, index_Integer] := IntegerDigits[BitXor[index, Quotient[index, 2]], 2, Length[basis]] Grid[Table[{i, Row[grayNum[{{0, 0}, {0, 1}, {1, 1}}, i]]}, {i, 0, 7}]]
ã€ã³ããã¯ã¹ | ã³ãŒã |
---|
0 | 000 |
1 | 001 |
2 | 011 |
3 | 010 |
4 | 110 |
5 | 111 |
6 | 101 |
7 | 100 |
次ã«ãç·åœ¢çµåã®ç¹å®ã®ç¯å²ã®ã€ã³ããã¯ã¹å
ã®éšåã¹ãã¯ãã«ã®ã¿ãèæ
®ããããã«ãã³ã³ãã€ã«ãããé¢æ°ãå€æŽããŸãã
WeightSpectrumLinearSubspaceGrayCodeRange = Compile[{{basis, _Integer, 2}, {range, _Integer, 1}}, Module[{ n = Dimensions[basis][[-1]], k = Length[basis], s = Table[0, {n + 1}], currentVector = Table[0, {i, 1, Length[basis[[1]]]}], m = 0, l = 0 }, (* *) If[range[[1]] =!= 0, currentVector = Mod[Total[basis Reverse[IntegerDigits[BitXor[range[[1]], Quotient[range[[1]] + 1, 2]], 2, k]]], 2]; ]; Mod[Total[basis IntegerDigits[BitXor[range[[1]] - 1, Quotient[range[[1]] - 1, 2]], 2, k]], 2]; s[[Total[currentVector] + 1]] = 1; Do[ m = Log2[BitAnd[-1 - b, b + 1]] + 1; currentVector = BitXor[currentVector, basis[[m]]]; l = Total[currentVector] + 1; s[[l]] = s[[l]] + 1, {b, First[range], Last[range] - 1, 1} ]; (* Return *) s ], (* , *) RuntimeOptions -> "Speed", (*CompilationTarget -> "C",*) CompilationOptions -> {"ExpressionOptimization" -> True} ];
ã€ãŸãã以åã«é¢æ°ã0ã2 N -1ã®çªå·ãæã€ãã¹ãŠã®çµã¿åãããã«ãŠã³ãããå Žåããã®ç¯å²ã¯æåã§èšå®ã§ããŸãã 次ã«ã䜿çšå¯èœãªã³ã¢ã®æ°ã«å¿ããŠããã®åãç¯å²ãçããéšåã«åå²ããæ¹æ³ãèããŠã¿ãŸãããã
partition[{i1_Integer, iN_Integer}, n_Integer] := With[{dn = Round[(iN - i1 + 1)/n]}, Join[ {{i1, i1 + dn - 1}}, Table[{dn * (i - 1), i * dn - 1}, {i, 2, n - 1}], {{(n - 1) * dn, iN}} ] ]
ããã§ããã®ãããªç»åã®å®å
šãªã¹ãã¯ãã«ãèšç®ããã«ã¯ãåã»ã°ã¡ã³ãã§ãããèšç®ãããã¹ãŠã®çµæãè¿œå ããå¿
èŠããããŸãã äŸïŒ
WeightSpectrumLinearSubspaceGrayCodeEasy[{{1, 1}, {1, 1}, {1, 1}}] WeightSpectrumLinearSubspaceGrayCodeRange[{{1, 1}, {1, 1}, {1, 1}}, {0, 3}] WeightSpectrumLinearSubspaceGrayCodeRange[{{1, 1}, {1, 1}, {1, 1}}, {4, 7}] (* Out[..] := {4, 0, 4} = Out[..] := {2, 0, 2} + Out[..] := {2, 0, 2} *)
æåŸã®ã¹ãããã¯ããããã®èšç®ãç°ãªãã«ãŒãã«ã«éä¿¡ããããšã§ãã
WeightSpectrumLinearSubspaceGrayCodeParallel[basis: {{__Integer}..}] := With[{ kernels = (If[Kernels[] === {}, LaunchKernels[]]; Kernels[]), parts = partition[{0, 2^Length[basis] - 1}, Length[Kernels[]]] }, Total[WaitAll[Table[ ParallelEvaluate[ParallelSubmit[WeightSpectrumLinearSubspaceGrayCodeRange[basis, parts[[$KernelID]]]], kernel], {kernel, kernels} ]]] ]
ããã§æ確ã«ããå¿
èŠããããŸãã ãã®ãããªãã³ãã«ã¯ãã©ã®ã«ãŒãã«ãã³ãŒãã®ã©ã®éšåã§å®è¡ãããããæåã§å¶åŸ¡ããããã®ParallelEvaluate + ParallelSubmitã§ãã äžè¬çãªå Žåã®ParallelEvaluateã¯ãéåæã³ãŒããæ£ããå®è¡ããæ¹æ³ãç解ã§ãããçµæãšããŠ1ã€ã®ã¹ã¬ããã§å®è¡ããŸãã ãŸããäžè¬çãªã±ãŒã¹ã®ParallelSubmitã§ã¯ãæ£ç¢ºãªã«ãŒãã«ãæå®ããããšã¯ã§ããŸããããèªåçã«éžæããŸãã
ãã®æ©èœãæ©èœãããã©ããã確èªããŸãã
ListPlot[WeightSpectrumLinearSubspaceGrayCodeParallel[RandomInteger[{0, 1}, {16, 128}]], PlotRange -> All, PlotTheme -> "Web", Filling -> Bottom]

ãããŠãã€ãã®ããã«ãèšç®é床ã®éããèŠãŠã¿ãŸãããã 4ã³ã¢ããã»ããµãæèŒããã©ãããããã䜿çšããããããå éã¯çŽ4åã«ãªããšäºæ³ãããŸãã ããã«ãã¿ã¹ã¯ãåå²ããŠæçµçµæãåèšããæéãèæ
®ããå¿
èŠããããŸãã
basis = RandomInteger[{0, 1}, {20, 1024}]; AbsoluteTiming[WeightSpectrumLinearSubspaceGrayCodeEasy[basis];] AbsoluteTiming[WeightSpectrumLinearSubspaceGrayCodeParallel[basis];] (* Out[..] := {5.02..., Null} Out[..] := {1.5....., Null} *)
åœç¶ãããã»ããµã³ã¢ã®æ°ãå€ããªããšãéãã¯ããé¡èã«ãªããŸãã ããã§ã¯ãåºåºã®ã¹ãã¯ãã«ãããã«èšç®ããŠã¿ãŸãããã ã©ã®ãããæéããããã®ã ãããïŒ 1ã€ã®èšç®ãå®äºããã®ã«1å以äžããããŸã§ãåºåºã®ãµã€ãºã倧ãããããšä»®å®ããŸãã
spectrums = Block[{i = 1, basis, res}, Reap[ While[True, i++; basis = RandomInteger[{0, 1}, {i, i}]; Sow[res = AbsoluteTiming[WeightSpectrumLinearSubspaceGrayCodeParallel[basis]]]; If[res[[1]] > 60, Break[]] ] ][[-1, -1]]] ListPlot[spectrums[[-1, -1]], PlotLabel->Row[{"basis len: ", Length[spectrums] + 1, "; time: ", Round[spectrums[[-1, 1]], 0.01], " sec"}], Filling->Bottom,PlotTheme->"Web",PlotRange->All]

ãã®å³ã¯ãé¢æ°ã29ã®ãã¯ãã«ã«åºã¥ããŠã¹ãã¯ãã«ã1ååã§èšç®ã§ããããšãæ確ã«ç€ºããŠããŸãã ããã¯ãã³ã³ãã€ã«ã䜿çšããªãæåã®ãªãã·ã§ã³ã§ããã°ã¬ã€ã³ãŒãïŒäžŠååïŒã劥åœãªæéå
ã«åãããšãå®äºããããšãã§ããªããããéåžžã«è¯ãçµæã§ãã 10次ââå
ã®15åã®ãã¯ãã«ã§ããèšç®ã«10ç§ä»¥äžããã£ãå Žåãèšç®æéã¯æ°ååã«ãªããŸãã
ãããã«
誰ããã©ãã§èšäºã«èšèŒãããŠãããã¹ãŠã®ãã®ãé©çšããã®ãããããŸããã ãŠã£ãããã£ã¢ã«ãããšãã°ã¬ã€ã³ãŒãã«ã¯å®çšçãªç®çããããšã®ããšã§ãã ãŸããã¹ãã¯ãã«ã®èšç®ã¯ãæå·åãç·åœ¢ä»£æ°ã®ä»ã®åé¡ã«é¢é£ããŠããããšãå€ãããšãç¥ã£ãŠããŸãã , , : , . , .
PS , .