Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.03 KB | None | 0 0
  1. <?
  2. set_time_limit(60*60*5);
  3. define('_N', 64);
  4. define('_V', _N/2);
  5. define('_V2', _V/2);
  6.  
  7. ini_set("memory_limit", "13000M");
  8. // echo ini_get('memory_limit');exit;
  9.  
  10. // echo PHP_INT_SIZE;
  11.  
  12. list($k1, $k2, $Lamd) = getK(_N);
  13.  
  14. define('_K1', $k1);
  15. define('_K2', $k2);
  16. define('_La', $Lamd);
  17.  
  18. define('_Z1', _V-_K1);
  19. define('_Z2', _V-_K2);
  20.  
  21. echo '<pre>';
  22. $microtime = microtime(true);
  23.  
  24. // $select_combine_1 = 9;
  25. // $select_combine_z_1 = 3;
  26. $combine_mas = getNumComp(_K1-1);
  27.  
  28. // foreach($combine_mas as $row){
  29.     // echo implode(',',$row)."\r\n";
  30.    
  31. // }
  32. // var_dump('N', _N,'k1',$k1,'k2',$k2,'Lamd',$Lamd);
  33. // exit;
  34.  
  35. $combine_mas_1_allow = array();
  36. $combine_mas_2_allow = array();
  37.  
  38. if(file_exists(_N."-task.dat")){
  39.    
  40.     $dat = json_decode(file_get_contents(_N."-task.dat"), true);
  41.     $combine_mas_1_allow = $dat['combine_mas_1_allow'];
  42.     $combine_mas_2_allow = $dat['combine_mas_2_allow'];
  43.    
  44. }else{
  45.  
  46.  
  47. foreach($combine_mas as $row){
  48.     $rows_z = getNumComp(_Z1-1, count($row));
  49.     $ccounts_k = array_count_values($row);
  50.    
  51.     foreach($rows_z as $row_z){
  52.        
  53.         $ccounts_z = array_count_values($row_z);
  54.        
  55.         // var_dump($row,$ccounts_k, $ccounts_z);exit;
  56.        
  57.         $lam1 = array_sum($row) - count($row);
  58.        
  59.         $lam2 = 0;
  60.         foreach($ccounts_k as $k=>$v) if($k>1) $lam2 += ($k-2)*$v;
  61.         foreach($ccounts_z as $k=>$v) if($k==1) $lam2 +=$v;
  62.         $combine_mas_1_allow[$lam1.'.'.$lam2.''][implode(',',$row)][] = $row_z;
  63.     }
  64. }
  65.  
  66. $combine_mas = getNumComp(_K2-1);
  67. foreach($combine_mas as $row){
  68.     $rows_z = getNumComp(_Z2-1, count($row));
  69.     $ccounts_k = array_count_values($row);
  70.    
  71.     foreach($rows_z as $row_z){
  72.        
  73.         $ccounts_z = array_count_values($row_z);
  74.        
  75.         // var_dump($row,$ccounts_k, $ccounts_z);exit;
  76.        
  77.         $lam1 = array_sum($row) - count($row);
  78.        
  79.         $lam2 = 0;
  80.         foreach($ccounts_k as $k=>$v) if($k>1) $lam2 += ($k-2)*$v;
  81.         foreach($ccounts_z as $k=>$v) if($k==1) $lam2 +=$v;
  82.        
  83.         $combine_mas_2_allow[convertLa2b($lam1).'.'.convertLa2b($lam2).''][implode(',',$row)][] = $row_z;
  84.        
  85.     }
  86. }
  87.  
  88. // $combine_mas = getNumComp(_K2-1);
  89. // $combine_mas_2_allow = array();
  90. // foreach($combine_mas as $row){
  91.     // $lam1 = convertLa2b(array_sum($row) - count($row));
  92.     // $combine_mas_2_allow[$lam1][] = $row;
  93. // }
  94.  
  95.  
  96.  
  97. foreach($combine_mas_1_allow as $key=>$row){
  98.     if(!isset( $combine_mas_2_allow[$key] )) {
  99.         unset($combine_mas_1_allow[$key]);
  100.     }
  101. }
  102. foreach($combine_mas_2_allow as $key=>$row){
  103.     if(!isset( $combine_mas_1_allow[$key] )) {
  104.         unset($combine_mas_2_allow[$key]);
  105.     }
  106. }
  107.  
  108.  
  109. ksort($combine_mas_1_allow);
  110.  
  111. file_put_contents(_N."-task.dat", json_encode(array('combine_mas_1_allow'=>$combine_mas_1_allow, 'combine_mas_2_allow'=>$combine_mas_2_allow)));
  112.  
  113. }
  114.  
  115.  
  116. // var_dump(array_keys($combine_mas_1_allow));exit;
  117.  
  118. // exit;
  119.  
  120.  
  121.  
  122. echo "N="._N.";"."V="._V.";"."K1="._K1.";"."K2="._K2.";"."La="._La.";"."Z1="._Z1.";"."Z2="._Z2.";"."\r\n";
  123. if(!_K1 || !_K2) exit;
  124.  
  125. file_put_contents(_N.'res.txt', "start ".date('Y-m-d H:i:s')."\r\n");
  126.  
  127.  
  128. // var_dump(array_keys($combine_mas_1_allow));
  129. // exit;
  130.  
  131. $i=0;
  132.  
  133. $vector_list = array();
  134. $result_list = array();
  135. foreach($combine_mas_1_allow as $keyv=>$combine_mas_1){
  136.    
  137.    
  138.    
  139.     // var_dump($combine_mas_1);
  140. echo "<h2>Генерация векторов A  - ".$keyv."</h2>";
  141.  
  142.  
  143.  
  144. file_put_contents(_N.'res.txt', "Генерация векторов A  - ".$keyv."\r\n", FILE_APPEND);
  145.  
  146. if($keyv<='9.9') continue;
  147.  
  148. // break;
  149. //Генерация векторов А
  150.    
  151. //11111010011000100000  11001000101001010000
  152. //combine 2,1,1,1,1,1 vs 4,3,2,2,1,1
  153. // var_dump($combine_mas_1);exit;
  154. foreach($combine_mas_1 as $key1 => $combine_mas_z_1){
  155.     // echo $key1."\r\n";
  156.     $combine_1 = explode(',',$key1);
  157.     $glen = count($combine_1);
  158.    
  159.     // $combine_mas_z_1 = getNumComp(_Z1-1, $glen);
  160.    
  161.     // echo implode(',',$combine_1)." combine_1\r\n";
  162.     foreach($combine_mas_z_1  as $combine_z_1){
  163.         // $tt = array();
  164.         // echo "combine ".implode(',',$combine_1)." vs ".implode(',',$combine_z_1)."\r\n";
  165.         // exit;
  166.         $temp_combine_z_1 = $combine_z_1;
  167.         do{
  168.            
  169.             $combine_z_1 = $temp_combine_z_1;
  170.             do{
  171.                 $v = getVector($combine_1, $combine_z_1);
  172.                 $key = getLamdKey($v);
  173.                 $vector_list[implode('',getInverseLamdKey($key))] = $v;
  174.                
  175.                
  176.             }while(NextSet($combine_z_1, $glen));
  177.            
  178.         }while(NextSet($combine_1, $glen));
  179.        
  180.         // echo implode(',',$combine_z_1)." combine_z ";
  181.         // foreach($tt as $ii=>$vv) echo "[".implode(',',array_keys($vv))."],";
  182.         // echo "\r\n";
  183.        
  184.        
  185.        
  186.     }
  187. }
  188. // echo 'step1';exit;
  189. // echo "<h2>Генерация векторов Б - ".$keyv."</h2>";
  190. //Генерация векторов Б
  191. $combine_mas_1 = $combine_mas_2_allow[$keyv];
  192. foreach($combine_mas_1 as $key1 => $combine_mas_z_1){
  193.     // echo $key1."\r\n";
  194.     $combine_1 = explode(',',$key1);
  195.     $glen = count($combine_1);
  196.     // $combine_mas_z_1 = getNumComp(_Z2-1, $glen);
  197.     foreach($combine_mas_z_1  as $combine_z_1){
  198.         // echo "combine ".implode(',',$combine_1)." vs ".implode(',',$combine_z_1)."\r\n";
  199.         $temp_combine_z_1 = $combine_z_1;
  200.         do{
  201.            
  202.             $combine_z_1 = $temp_combine_z_1;
  203.            
  204.             do{
  205.                
  206.                 $v = getVector($combine_1, $combine_z_1);
  207.                 $key = getLamdKey($v);
  208.                 $key_str = implode('',$key);
  209.                 if(isset($vector_list[$key_str]))  {
  210.                     $result_list[$vector_list[$key_str]] = $v;
  211.                     file_put_contents(_N.'res.txt', showVector($vector_list[$key_str], true)."\t".showVector($v, true)."\t[".implode(',',getKey($v))."]\r\n", FILE_APPEND);
  212.                     break 2;
  213.                 }
  214.                
  215.                
  216.             }while(NextSet($combine_z_1, $glen));
  217.            
  218.            
  219.         }while(NextSet($combine_1, $glen));
  220.        
  221.        
  222.        
  223.     }
  224. }
  225.  
  226. $size = memory_get_usage();
  227. echo "list size = $size byte\r\n";
  228.  
  229.  
  230.  
  231.     // break;
  232.  
  233. }
  234. var_dump('count result ' .count($result_list));
  235. // var_dump($result_list);
  236.  
  237. $size = memory_get_usage();
  238. echo "list size = $size byte\r\n";
  239.  
  240.  
  241. echo "\r\n"._N."\tTime: ".(microtime(true)-$microtime). "";
  242. echo "END\r\n";
  243. file_put_contents(_N.'res.txt', "end ".date('Y-m-d H:i:s')."\r\n", FILE_APPEND);
  244. // showKey(getKey($v));
  245.  
  246.  
  247.  
  248.  
  249. // exit;
  250.  
  251. function convertEa($l){
  252.     $e = _V - 4*(_K1 - $l);
  253.     return $e;
  254. }
  255. function convertEb($l){
  256.     $e = _V - 4*(_K2 - $l);
  257.     return $e;
  258. }
  259.  
  260. function convertLa2b($l){
  261.     $e = _V - 4*(_K1 - $l);
  262.     $l2 = - ((-$e - _V)/-4 - _K2);
  263.     return $l2;
  264. }
  265.  
  266. function convertLb2a($l){
  267.     $e = _V - 4*(_K2 - $l);
  268.     $l2 = - ((-$e - _V)/-4 - _K1);
  269.     return $l2;
  270. }
  271.  
  272. //Циклический сдвиг вектора
  273. function ROL($value, $shift)
  274. {
  275.     // showVector(((1<<_V)-1)); echo "\r\n";
  276.     return ( ($value << $shift) | ($value >> (_V-$shift)) ) & ((1<<_V)-1);
  277. }
  278.  
  279. //Возвращает количество единиц в бинарном представлении числа
  280. function EC($xor){
  281.     $xor -= ($xor >> 1) & 0x5555555555555555;
  282.     $xor = (($xor >> 2) & 0x3333333333333333) + ($xor & 0x3333333333333333);
  283.     $xor = (((($xor >> 4) + $xor) & 0x0F0F0F0F0F0F0F0F) * 0x0101010101010101) >> 56;
  284.     return $xor;
  285. }
  286.  
  287. //Выводит ключ вектора на экран
  288. function showKey($key){
  289.     echo "[".implode(',',$key)."]";
  290. }
  291.  
  292. //На основании бинарного представления вектора
  293. //вычисляет его ключ из лямбда
  294. function getLamdKey($vector){
  295.     $key = array();
  296.     for($i=1; $i<=_V2; $i++){
  297.         $e = EC($vector & ROL($vector,$i));
  298.         $key[] = $e;
  299.         // showVector($xor);
  300.         // echo " - $i - $e\r\n";
  301.     }
  302.     return $key;
  303. }
  304. function getInverseLamdKey($key){
  305.     $ret = array();
  306.     foreach($key as $k=>$e) $ret[$k] = convertLa2b($e);
  307.     return $ret;
  308. }
  309. function getInverseKey($key){
  310.     $ret = array();
  311.     foreach($key as $k=>$e) $ret[$k] = -$e;
  312.     return $ret;
  313. }
  314. //На основании бинарного представления вектора
  315. //вычисляет его ключ
  316.  
  317. function getKey($vector){
  318.     $key = array();
  319.     for($i=1; $i<=_V2; $i++){
  320.         $xor = $vector ^ ROL($vector,$i);
  321.         $e = _V - EC($xor)*2;
  322.         $key[] = $e;
  323.         // showVector($xor);
  324.         // echo " - $i - $e\r\n";
  325.     }
  326.     return $key;
  327. }
  328.  
  329. //Из массивов груп единиц и нулей делает бинарное представление вектора
  330. //[3,1,1] [2,2,1] = 1110010010
  331. function getVector($ar_k, $ar_z){
  332.     // var_dump($ar_k, $ar_z);
  333.     $vector = 0;
  334.     // var_dump($ar_k,$ar_z);
  335.     foreach($ar_k as $k=>$v){
  336.         $vector = $vector<<$v;
  337.         // $vector |= pow(2,$v)-1;
  338.         $vector |= (1<<$v)-1;
  339.         $vector = $vector<<$ar_z[$k];
  340.     }
  341.     return $vector;
  342. }
  343.  
  344. //Переводит бинарное представление вектора в строку
  345. function showVector($vector, $ret=false){
  346.     $str = decbin($vector);
  347.     if($ret) return $str;
  348.     echo $str;
  349. }
  350.  
  351. //Вычисляет переменные К для N сложности
  352. function getK($N){
  353.     $V=$N/2;
  354.     $k1=$k2=0;
  355.     for ($x=0;$x<$V;$x++)
  356.     for ($y=0;$y<$V;$y++)
  357.         if ($x*$x+$y*$y==$N) { $k1=($V-$x)/2; $k2=($V-$y)/2; }
  358.     $lambda=$k1+$k2-$N/4;
  359.     return array($k1,$k2,$lambda);
  360. }
  361.  
  362.  
  363. //Раскладывает число на слагаемые: 5 = 5 = 4+1 = 3+2 = 3+1+1 = 2+1+1+1 = 1+1+1+1+1
  364. function getNumComp($left, $mas_len = false, &$sums=array(), &$sum=array(),$min = 1, $i = 0){
  365.    
  366.    
  367.     if ($left < 0) return;
  368.     $sum[$i] = $min;
  369.     if ($min != 0)
  370.     {
  371.       getNumComp($left - $min, $mas_len,$sums, $sum, $min, $i + 1);
  372.     }
  373.     getNumComp($left - 1, $mas_len,$sums, $sum, $min + 1, $i);
  374.     if ($left == 0)
  375.     {
  376.         $ar = array();
  377.         for ($j = 0; $j <= $i; ++$j){
  378.             $ar[] = $sum[$j];
  379.         }
  380.         if(!$mas_len || count($ar)==$mas_len) $sums[] = $ar;
  381.     }
  382.      return $sums;  
  383. }
  384.  
  385.  
  386. //Возвращает следущую комбинацию чисел
  387. function NextSet(&$a, &$n)
  388. {
  389.     static $s;
  390.     //https://prog-cpp.ru/permutation/
  391.   $j = $n - 2;
  392.   while ($j != -1 && $a[$j] >= $a[$j + 1]) $j--;
  393.   if ($j == -1)
  394.     return false; // больше перестановок нет
  395.   $k = $n - 1;
  396.   while ($a[$j] >= $a[$k]) $k--;
  397.  
  398.     $s = $a[$j];  $a[$j] = $a[$k];  $a[$k] = $s;
  399.  
  400.   $l = $j + 1;
  401.   $r = $n - 1; // сортируем оставшуюся часть последовательности
  402.   while ($l<$r)
  403.   {
  404.     $s = $a[$l];  $a[$l] = $a[$r];  $a[$r] = $s; ++$l; --$r;
  405.   }
  406.   return true;
  407. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement