Ачат -- Форум математиков

Discussion in 'Болталка' started by j0sur, 11 Aug 2012.

  1. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    ага, невнимательный, тогда вот так:

    Code:
    #!/usr/bin/perl
    $nn=19; # Ваше число, которое надо разложить на сумму взаимно простых чисел
    $nnn=4; # Минимальное кол-во слагаемых
    for(my $i=2;$i<$nn; $i++){
      push(@pers,$i);
    }
    sub gcd
    {
      my @xx=@_;$size = @xx; 
      for($i=0;$i<$size;$i++){
         $x=$xx[$i]; $y=$xx[$i+1];
         while($x){
          ($x, $y)=($y, $x) if $x>$y;
          $y-=$x;
         }
         return $y;
      }
    }
    print "\nAll simple numbers in $nn: [@pers] \n";
    $size = @pers;
    crack($size);
    sub crack{
     $| = 1;
     $CharSet = shift;
     @RawString = ();
     for (my $i =0;$i<$CharSet;$i++){ $RawString[i] = 0;}
     do{
      for (my $i =0;$i<$CharSet;$i++){
       if ($RawString[$i] > $size){
        if ($i==$CharSet-1){
        $cnt=0;
        return false;
       }
       $RawString[$i+1]++;
       $RawString[$i]=0;
       }
      }
       $ret = "";
       $ret1 = 0;
       for (my $i=0;$i<$CharSet;$i++){ 
             $my=length($pers[$i]);  
             $ret = $ret."+".substr($pers[$i],$RawString[$i],$my);
             @pers1 = split /\+/,$ret;@pers1 = grep {$_} @pers1;@pers1=grep{$_!=1} @pers1;$size1=@pers1;
     	if($size1==$nnn){$gcd=gcd(@pers1)}
             print "Variants: $cnt\r";
             $ret1 = $ret1+substr($pers[$i],$RawString[$i],$my);
             #print "@pers1\n";
             if($ret1==$nn && $size1==$nnn && $gcd==1){
               print "\n\n===> @pers1\n";
               exit; 
             }  
       }
       $cnt++;
       $RawString[0]++;
     }while($RawString[$CharSet-1]<$size);
    }
    
    PS: пришлось писать алгортим Евклида для массива

    PPSS: мать, только сейчас увидел для "9-15 знаков" :))) В пень
     
    #21 Pashkela, 12 Aug 2012
    Last edited: 12 Aug 2012
  2. alias6969

    alias6969 Member

    Joined:
    3 Apr 2011
    Messages:
    27
    Likes Received:
    11
    Reputations:
    6
    Code:
    #include <iostream>
    
    using namespace std;
    
    __int64 gcd(__int64 a, __int64 b)
    {
        if ( a == b ) return -1;
        while( 1 )
        {
            a = a % b;
    		if ( a == 0 ) return b;
    		b = b % a;
            if( b == 0 ) return a;
        }
    }
    
    int main()
    {
        __int64 a, b, c, d;
        __int64 x = 100000700000666;
        int p = 100;
    
        for ( a = x / 4; a > x / 4 - p; a-- )
        {
            for ( b = x / 4; b > x / 4 - p; b-- )
            {
                if ( gcd(a,b) != 1) continue;
                for ( c = x / 4; c > x / 4 - p; c--)
                {
                    if ( gcd(a,c) != 1) continue;
                    if ( gcd(b,c) != 1) continue;
                    d = x - a - b - c;
                    if ( gcd(a,d) != 1) continue;
                    if ( gcd(b,d) != 1) continue;
                    if ( gcd(c,d) != 1) continue;
                    cout << a << endl << b << endl << c << endl << d << endl;
                    return 0;
                }
            }
        }
    }
    
    Проверка: тыц тыц тыц тыц тыц тыц
     
Loading...