Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Рассказы ΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° языках Python ΠΈ C (БИ)Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 7

Автор ЕлисССв Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Π‘Π΅Ρ€Π³Π΅Π΅Π²ΠΈΡ‡

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, слСгка ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Как Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ссли число N дСлится Π½Π°Ρ†Π΅Π»ΠΎ Π½Π° P, Ρ‚ΠΎ ΠΌΡ‹ Β«Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠΌΒ» сразу Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ N/P. НапримСр, Ссли 10 дСлится Π½Π°Ρ†Π΅Π»ΠΎ Π½Π° 2, Ρ‚ΠΎ ΠΎΠ½ΠΎ дСлится ΠΈ Π½Π° 10 / 2 = 5. Π­Ρ‚ΠΎ позволяСт Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ число Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π°. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚ΠΈΠΏ чисСл Decimal, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большиС числа. ОбновлСнная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выглядит Ρ‚Π°ΠΊ:

from decimal import *

def is_perfect(n):

Β Β Β Β s = Decimal(1)

Β Β Β Β p = Decimal(2)

Β Β Β Β while p < n.sqrt()+1:

Β Β Β Β Β Β Β Β if n % p == 0:

Β Β Β Β Β Β Β Β Β Β Β Β s += p

Β Β Β Β Β Β Β Β Β Β Β Β if p != n/p: s += n/p

Β Β Β Β Β Β Β Β p += 1

Β Β Β Β return s == n

print(is_perfect(Decimal('137438691328')))

ЗапускаСм, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ β€” число '137438691328' Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ являСтся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΌ. Оно дСлится Π½Π° 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524287, 1048574, 2097148, 4194296, 8388592, 16777184, 33554368, 67108736, 134217472, 268434944, 536869888, 1073739776, 2147479552, 4294959104, 8589918208, 17179836416, 34359672832 ΠΈ 68719345664, сумма этих чисСл Ρ€Π°Π²Π½Π° 137438691328. Однако, Π½Π° ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Β«ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΡΡ‚ΠΈΒ» Π΄Π°Π½Π½ΠΎΠ³ΠΎ числа заняла… 54 сСкунды. Π­Ρ‚ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ быстро ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с 16-ΠΌ Π²Π΅ΠΊΠΎΠΌ, Π½ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ нСдостаточно Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ всС числа, хотя Π±Ρ‹ Π΄ΠΎ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π°. Π—Π½Π°Ρ‡ΠΈΡ‚ ΠΏΠΎΡ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΡΠΆΠ΅Π»ΡƒΡŽ Π°Ρ€Ρ‚ΠΈΠ»Π»Π΅Ρ€ΠΈΡŽ β€” ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° языкС Π‘ΠΈ. ВсС-Ρ‚Π°ΠΊΠΈ Python это ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π½Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС:

#include <string.h>

#include <math.h>

#include <stdbool.h>

#include <stdint.h>

bool isPerfect(unsigned long long int n)

{

Β Β unsigned long long int sum = 1, i;

Β Β for(i=2; i<=sqrt(n)+1; i++)

Β Β {

Β Β Β Β if (n%i==0) {

Β Β Β Β Β Β sum += i;

Β Β Β Β Β Β if (i != n/i) {

Β Β Β Β Β Β Β Β sum += n/i;

Β Β Β Β Β Β }

Β Β Β Β }

Β Β }

Β Β return sum == n;

}

int main()

{

Β Β unsigned long long int n = 137438691328LL;

Β Β bool res = isPerfect(n);

Β Β printf("%d\n", res);

Β Β return 0;

}

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ компилятора gcc, запускаСм ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ exe-Ρ„Π°ΠΉΠ»: врСмя выполнСния мСньшС сСкунды, ΡƒΠΆΠ΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ нСслоТно ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° всСх чисСл ΠΎΡ‚ 1 Π΄ΠΎ 200000000000. Π’ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 1000000 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ…ΠΎΠ΄ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

int main()

{

Β Β unsigned long long int MAX = 200000000000LL;

Β Β unsigned long long int p;

Β Β for (p=1; p<MAX; p++) {

Β Β Β Β if (isPerfect(p))

Β Β Β Β Β Β printf(" %llu ", p);

Β Β Β Β Β Β Β Β if (p % 1000000 == 0)

Β Β Β Β Β Β Β Β Β Β printf("*%llu,%llu*", 100*p/MAX, p);

Β Β }

}

Π£Π²Ρ‹, ΠΏΡ€ΠΎΠ³Π½ΠΎΠ· ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ скорости расчСтов оказался слишком оптимистичным. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π·Π° час Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Π½ΠΎ лишь 100Β ΠΌΠ»Π½. Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Π° для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° всСх 200Β ΠΌΠ»Ρ€Π΄. понадобился Π±Ρ‹ Π½Π΅ ΠΎΠ΄ΠΈΠ½ дСнь. Π–Π΅Π»Π°ΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ процСсс ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ с ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 1 Π΄ΠΎ 100000000 Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹Ρ… чисСл ΠΊΡ€ΠΎΠΌΠ΅ 6, 28, 496, 8128 ΠΈ 33550336.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° числа 2Β 305Β 843Β 008Β 139Β 952Β 128 являСтся нСпростой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°ΠΆΠ΅ для соврСмСнного домашнСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° β€” Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π² языкС C/C++ Π½Π΅Ρ‚ встроСнных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… для ΡΡ‚ΠΎΠ»ΡŒ большого числа, Π° Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, число Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° вСсьма Π²Π΅Π»ΠΈΠΊΠΎ.

РазумССтся, Π²Ρ‹ΡˆΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ самоС простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Β«Π² Π»ΠΎΠ±Β», ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ саму ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ вычислСниС Π½Π° нСсколько процСссорных ядСр, ΠΎΠ΄Π½Π°ΠΊΠΎ данная Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этого ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°. НСмного ΠΏΡ€ΠΎ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ вычислСния Π±ΡƒΠ΄Π΅Ρ‚ рассказано Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ½ΠΈΠ³ΠΈ.

7.Β ΠœΠ°Π³ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° старинная матСматичСская Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠ° β€” магичСский ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚. ΠœΠ°Π³ΠΈΡ‡Π΅ΡΠΊΠΈΠΌ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ Π½Π΅ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ числами Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ суммы чисСл ΠΏΠΎ горизонталям, вСртикалям ΠΈ диагоналям ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹. Π’Π°ΠΊΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ извСстны Π΄Π°Π²Π½ΠΎ, самым старым ΠΈΠ· извСстных являСтся магичСский ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π›ΠΎ Π¨Ρƒ, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² ΠšΠΈΡ‚Π°Π΅ Π² 2200Β Π³. Π΄ΠΎ нашСй эры. Если ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство Ρ‚ΠΎΡ‡Π΅ΠΊ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ пСрСвСсти ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² соврСмСнный Π²ΠΈΠ΄, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ справа.

Рассказы ΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° языках Python ΠΈ C (БИ) - img_14.jpeg

ΠœΠ°Π³ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ 4Ρ…4 Π±Ρ‹Π» ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ Π² индийских надписях 11 Π²Π΅ΠΊΠ°:

Рассказы ΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° языках Python ΠΈ C (БИ) - img_15.jpeg

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, извСстный ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ 4Ρ…4, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ Π½Π° Π³Ρ€Π°Π²ΡŽΡ€Π΅ Π½Π΅ΠΌΠ΅Ρ†ΠΊΠΎΠ³ΠΎ Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ° Π”ΡŽΡ€Π΅Ρ€Π° Β«ΠœΠ΅Π»Π°Π½Ρ…ΠΎΠ»ΠΈΡΒ». Π­Ρ‚ΠΎΡ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Π½Π΅ просто Ρ‚Π°ΠΊ, 2 числа 1514 ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Π΄Π°Ρ‚Ρƒ создания Π³Ρ€Π°Π²ΡŽΡ€Ρ‹.

Рассказы ΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° языках Python ΠΈ C (БИ) - img_16.jpeg

Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΡƒΠΆΠ΅ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ ΡƒΠΌΠ΅Π»ΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ магичСскиС ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ Ρ€Π°Π·Π½ΠΎΠΉ размСрности. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΡ… свойства.

Π‘ΡƒΠΌΠΌΠ° чисСл магичСского ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π° NxN зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ N, ΠΈ опрСдСляСтся Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΎΠΉ:

Рассказы ΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° языках Python ΠΈ C (БИ) - img_17.jpeg

Π­Ρ‚ΠΎ нСслоТно Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‚.Β ΠΊ. сумма всСх чисСл ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Ρ€Π°Π²Π½Π° суммС ряда 1..N2. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, для ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π”ΡŽΡ€Π΅Ρ€Π° M(4) = 34, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π΅. Для ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² Ρ€Π°Π·Π½ΠΎΠΉ размСрности суммы Ρ€Π°Π²Π½Ρ‹ соотвСтствСнно: M(3) = 15, M(4) = 34, M(5) = 65, M(6) = 111, M(7) = 175, M(8) = 260, M(9) = 369, M(10) = 505.