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

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

  1. j0sur

    j0sur Member

    Joined:
    8 Apr 2012
    Messages:
    140
    Likes Received:
    7
    Reputations:
    0
    Есть число, 19 например. Нужно его разложить на 4 взаимнопростых числа, сумма которых равна 19(3,4,5,7). Как реализовать?
    Или пошлите на хороший форум, где трутся математики. Заранее благодарен.
     
  2. lacky

    lacky Banned

    Joined:
    5 Nov 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Математики трутся здесь ---> dxdy
     
  3. raven1992

    raven1992 New Member

    Joined:
    6 Oct 2011
    Messages:
    56
    Likes Received:
    3
    Reputations:
    0
    если не выпендриваться - то методом перебора, написав программу.
    А если это тебе задали в рамках какой-нибудь учебной программы, и требуется решить логически... тогда я не знаю. Смахивает на мат.логику. Может как-нибудь через графы попробовать.
    При этом, собственно, для 19 или другого маленького числа - это то можно перебрать все варианты и в уме.
    А вот если у тебя будет какое-нибудь 1286 - тогда нужен чёткий план
     
    #3 raven1992, 11 Aug 2012
    Last edited: 11 Aug 2012
  4. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    917
    Likes Received:
    492
    Reputations:
    724
    Обычным циклом с условиями, на любом ЯП.
     
    _________________________
  5. j0sur

    j0sur Member

    Joined:
    8 Apr 2012
    Messages:
    140
    Likes Received:
    7
    Reputations:
    0
    Ну, числа будут иметь порядка 9-15 знаков, так шо это капэц...
    Буду благодарен за приблизительный план.
     
  6. bugagasenki

    bugagasenki Member

    Joined:
    10 Dec 2011
    Messages:
    217
    Likes Received:
    14
    Reputations:
    -1
    Может и бред написал, но вспомнил школьные времена :)

    x+y+a+z=19
    X любое число > или = 16, например 8
    8+y+a+z=19
    y+a+z=11
    Y любое число > или = 9, например 3
    3+a+z=11
    a+z=8
    A любое число > или = 7, например 2
    2+z=8
    z=6
     
  7. j0sur

    j0sur Member

    Joined:
    8 Apr 2012
    Messages:
    140
    Likes Received:
    7
    Reputations:
    0
    Да, но тут еще нужна проверка на взаимную простоту...
     
  8. raven1992

    raven1992 New Member

    Joined:
    6 Oct 2011
    Messages:
    56
    Likes Received:
    3
    Reputations:
    0
    9-15 знаков... пидец.
    Ну чё, тогда мозговой штурм.
    Значит, сначала нужно получить все простые числа, меньшие заданного.
    Это удовольствие высчитывается заранее, всего один раз. (а вообще, они все уже давным давно высчитаны, можно взять готовые)
    Далее - все слагаемые - это либо простые числа, либо их произведения. Простых чисел - не так много, а вот их произаедений много.
    Высчитать все возможные произведения всех возможных простых чисел(меньших заданного), чтобы эти произведения тоже были меньше заданного (при этом произведения могут иметь хоть 10 хоть 20 множителей, являющихся простыми числами).
    А затем пробовать складывать последние три цифры этих "всех возможных произведений", чтобы проверить - сходится с результатом или нет. Если сходится - проверять более подробно.

    В общем выглядит как вычислительный адъ
     
  9. ZdezBilYa

    ZdezBilYa Elder - Старейшина

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    На самом деле достаточно взять любые два взаимнопростых числа (не равных единице) и тогда все четыре будут автоматически взаимнопростые.
    Т.е. дано число 1000.
    Берём любые два взаимнопростых, например, 33 и 34.
    Берём любые два других, которые в сумме с двумя первыми дадут тысячу: 1000-(33+34)=933 , например, 2+931.
    Числа 2, 33, 34, 931 являются взаимнопростыми автоматически
     
    #9 ZdezBilYa, 11 Aug 2012
    Last edited: 12 Aug 2012
  10. j0sur

    j0sur Member

    Joined:
    8 Apr 2012
    Messages:
    140
    Likes Received:
    7
    Reputations:
    0
    Ыыыы, а я нашел простое решение)))))
    >>> s=789
    >>> h=s/2
    >>> h
    394.5
    >>> h1=384
    >>> h2=385 #h1+h2=s
    >>> n1=233
    >>> n2=h1-n1
    >>> n2
    151
    >>> n3=351
    >>> n4=h2-n3
    >>> o=0
    >>> for n in [n1,n2,n3,n4]:
    o+=n


    >>> o
    769
    Теперь только проверку на взаимную простоту прикрутить.
    Тож ниче, вот только 2 и 34... Но покручу.
     
  11. AnGeI

    AnGeI Elder - Старейшина

    Joined:
    8 Dec 2008
    Messages:
    395
    Likes Received:
    79
    Reputations:
    16
    Берешь число, дальше проверяешь каждое число от нуля до данного числа является ли оно простым, например за формулой Мерсенна и Ферма. Дальше уже за каким-нибудь алгоритмом ищешь возможные комбинации.
    Наверняка есть уже готовая такая программа, если найдешь - выложи, интересно взглянуть.
     
  12. alkos

    alkos Elder - Старейшина

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    В математике есть такая проблема Гольдбаха (в некоторых физмат школах она даже в школьный курс входит). Она развита для бинарного и тренарного случая. В данном случае ее предлагается расширить на 4 компоненты.

    В данном случае достаточно применить дважды бинарную теорему Гольдбаха. А именно: искомое число должно быть четным, ибо нечетное число невозможно разложить на 4 простых. Тогда это число можно попытаться разложить на сумму двух четных чисел. После этого для каждого полученного числа можно применить бинарную теорему Гольдбаха. Пользуйтесь.
     
  13. ZdezBilYa

    ZdezBilYa Elder - Старейшина

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    Тут же тема не о простых числах, а о взаимнопростых
     
  14. alias6969

    alias6969 Member

    Joined:
    3 Apr 2011
    Messages:
    27
    Likes Received:
    11
    Reputations:
    6
    Нужны взаимно простые или попарно взаимно простые? Взаимно простые - когда для каждого числа из набора нет общего делителя, кроме 1, попарно .. - когда для любой пары.
    Есть разница.
     
  15. j0sur

    j0sur Member

    Joined:
    8 Apr 2012
    Messages:
    140
    Likes Received:
    7
    Reputations:
    0
    Все четыре должны быть взаимно простыми между собой.
     
  16. alkos

    alkos Elder - Старейшина

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    Действительно, сразу не заметил. Тогда этот метод не годится.

    В таком случае задача чем-то походит на решение диофантовых уравнений.
     
    #16 alkos, 12 Aug 2012
    Last edited: 12 Aug 2012
  17. alias6969

    alias6969 Member

    Joined:
    3 Apr 2011
    Messages:
    27
    Likes Received:
    11
    Reputations:
    6
    Не вижу проблемы, 10^15 помещается в 64 бита.
     
  18. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    вот все простые числа из 19:

    [2 3 5 7 11 13 17]

    покажите мне хоть один вариант, когда у вас есть четыре слагаемых из представленного массива, чтобы получилось 19

    PS: 4 в вашем варианте (3,4,5,7) - не простое число

    задача "имеет решение", только если возможны повторы:

    2 3 11 3

    но тогда нарушается другое условие - "взаимнопростых числа", т.к. всегда будут повторы (тут 3 и 3 -два взаимно простых числа). Вывод - решения у задачи нет. Кто вам такую задачу дал и зачем, и главное - что вы сделали этому человеку:)

    Ниже скрипт для поиграться (сырой и необкатанный, но основные моменты видны):

    Code:
    #!/usr/bin/perl
    $nn=56; # Ваше число, которое надо разложить на сумму простых чисел
    $nnn=4; # Минимальное кол-во слагаемых
    push(@pers,2);
    for(my $i=3;$i<$nn; $i+=2){
      my $flag=1;
      for(my $j=3; $j**2<=$i; $j+=2){if($i % $j==0){$flag=0;last;}}
      push(@pers,$i) if $flag;
    }
    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;
             print "Variants: $cnt\r";
             $ret1 = $ret1+substr($pers[$i],$RawString[$i],$my);
             #print "@pers1\n";
             if($ret1==$nn && $size1==$nnn){
               print "\n\n===> @pers1\n";
               exit; 
             }  
       }
       $cnt++;
       $RawString[0]++;
     }while($RawString[$CharSet-1]<$size);
    }
    
     
    #18 Pashkela, 12 Aug 2012
    Last edited: 12 Aug 2012
  19. alkos

    alkos Elder - Старейшина

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    Pashkela, в задаче речь не о простых числах, а о взаимно простых!
     
  20. j0sur

    j0sur Member

    Joined:
    8 Apr 2012
    Messages:
    140
    Likes Received:
    7
    Reputations:
    0
    Для тек, кто будет интересоваться этой темой, оставлю здесь линк на аналогичную тему на dxdy. Там найден ответ.
    http://dxdy.ru/post605334.html#p605334
     
Loading...