From 1da2b524a6d043140a126e0c26d6fa011768dee3 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Tue, 6 Aug 2024 19:34:10 +0300 Subject: [PATCH] School PrimeDivisors --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- Localization/DefaultLang.resources | Bin 102075 -> 102214 bytes Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- TestSuite/CompilationSamples/School.pas | 137 ++++++++++++++------- bin/Lib/School.pas | 137 ++++++++++++++------- 7 files changed, 191 insertions(+), 93 deletions(-) diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 819c8725e..3ef730bbf 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "9"; public const string Build = "0"; - public const string Revision = "3521"; + public const string Revision = "3522"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index b02447251..3352be192 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=9 -%REVISION%=3521 %COREVERSION%=0 +%REVISION%=3522 +%MINOR%=9 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index 8dc705a64013c4149895feddeafb89523b36e529..76ccae314990547d39017c81166c6881ea122d1a 100644 GIT binary patch delta 163 zcmV;U09^mOod(9929V$aVve!m8Vr9#NmD^WOhsQ)R6$NeK~h9tRZdA%Q(r_$Qbj{l zNmfN)L`hRYOiWK#MMPgoPG411MMPg!PDxZ#J=5yo=iu$=c&WMOh-Rc>i?b0;9;An)$v>g)dZ$k8Sr{wh0fIuJ>+yB*oL*&bz&xmvMh10FqV;`v3p{ diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 73d44ffea..8a8498c43 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.9.0.3521 +3.9.0.3522 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 578847a42..89a915082 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.9.0.3521' +!define VERSION '3.9.0.3522' diff --git a/TestSuite/CompilationSamples/School.pas b/TestSuite/CompilationSamples/School.pas index ba0409884..62b739da0 100644 --- a/TestSuite/CompilationSamples/School.pas +++ b/TestSuite/CompilationSamples/School.pas @@ -1,4 +1,4 @@ -/// Учебный модуль, реализующий базовые алгоритмы информатики (31.07.2024) +/// Учебный модуль, реализующий базовые алгоритмы информатики (01.08.2024) unit School; interface @@ -200,9 +200,6 @@ function LCM(a, b: int64): int64; /// Возвращает НОД и НОК пары чисел function НОДНОК(a, b: int64): (int64, int64); -/// Разложение числа на простые множители -function Factorize(n: integer): List; - /// возвращает True, если число n простое и False в противном случае function IsPrime(n: integer): boolean; @@ -215,16 +212,31 @@ function Primes(m, n: integer): List; /// Первые k простых чисел function FirstPrimes(k: integer): List; -/// Количество простых делителей числа n +/// Разложение числа на простые множители (список всех его простых делителей) +function Factorize(n: integer): List; + +/// Список уникальных простых делителей числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел при n >= 4 возвращается список уникальных простых делителей. +function PrimeDivisors(n: integer): List; + +/// Количество уникальных простых делителей числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. /// Для составных чисел при n >= 4 возвращается количество уникальных простых делителей. function PrimeDivisorsCount(n: integer): integer; -/// Количество простых факторов числа n +/// Список простых факторов (простых делителей) числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел n >= 4 возвращается список всех простых факторов. +function PrimeFactors(n: integer): List; + +/// Количество простых факторов (простых делителей) числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. -/// Для составных чисел при n >= 4 возвращается количество простых делителей. +/// Для составных чисел при n >= 4 возвращается количество всех простых факторов. function PrimeFactorsCount(n: integer): integer; /// Возвращает целочисленный список расширенного представления @@ -677,35 +689,6 @@ end; {$endregion} -{$region Factorize} - -/// Разложение числа n на простые множители -function Factorize(n: integer): List; -begin - n := Abs(n); - Result := new List; - foreach var Divisor in LPrimes do - begin - while (Sqr(Divisor) <= n) and (n >= Divisor) do - if n mod Divisor = 0 then - begin - Result.Add(Divisor); - n := n div Divisor; - end - else - break; - if n < Divisor then - break - end; - Result.Add(n) -end; - -/// Разложение числа на простые множители -function Factorize(Self: integer): List; extensionmethod := -Factorize(Self); - -{$endregion} - {$region Primes} // Внутреняя процедура для заполнения LPrimes @@ -830,7 +813,7 @@ begin begin Result := LPrimes; var kprimes := nPrimeDivs; // количество найденных простых чисел - var n := maxPrimeDiv + 2; // очередной кандидат на простое число + var n := maxPrimeDiv + 2; // очередной кандидат на простое число repeat if n.IsPrime then begin @@ -842,7 +825,38 @@ begin end end; -/// Количество простых делителей числа n +/// Список уникальных простых делителей числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел при n >= 4 возвращается список уникальных простых делителей. +function PrimeDivisors(n: integer): List; +begin + Result := new List; + if n < 2 then exit; + var (i, prime, m) := (0, LPrimes[0], n); + while Sqr(prime) <= n do + begin + if n mod prime = 0 then + begin + Result.Add(prime); + repeat + n := n div prime + until n mod prime <> 0 + end; + Inc(i); + prime := LPrimes[i]; + end; + if Result.Count = 0 then Result.Add(m) + else if n > 1 then Result.Add(n) +end; + +/// Список уникальных простых делителей числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел при n >= 4 возвращается список уникальных простых делителей. +function PrimeDivisors(Self: integer): List; extensionmethod := PrimeDivisors(Self); + +/// Количество уникальных простых делителей числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. /// Для составных чисел при n >= 4 возвращается количество уникальных простых делителей. @@ -868,20 +882,49 @@ begin else if n > 1 then Result += 1 end; -/// Количество простых делителей числа n +/// Количество уникальных простых делителей числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. /// Для составных чисел при n >= 4 возвращается количество уникальных простых делителей. function PrimeDivisorsCount(Self: integer): integer; extensionmethod := PrimeDivisorsCount(Self); -/// Количество простых факторов числа n +/// Список простых факторов (простых делителей) числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел n >= 4 возвращается список всех простых факторов. +function PrimeFactors(n: integer): List; +begin + Result := new List; + if n < 2 then exit; + var (i, prime, m) := (0, LPrimes[0], n); + while Sqr(prime) <= n do + begin + while n mod prime = 0 do + begin + Result.Add(prime); + n := n div prime + end; + Inc(i); + prime := LPrimes[i]; + end; + if Result.Count = 0 then Result.Add(m) + else if n > 1 then Result.Add(n) +end; + +/// Список простых факторов (простых делителей) числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел n >= 4 возвращается список всех простых факторов. +function PrimeFactors(Self: integer): List; extensionmethod := PrimeFactors(Self); + +/// Количество простых факторов (простых делителей) числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. -/// Для составных чисел при n >= 4 возвращается количество простых делителей. +/// Для составных чисел при n >= 4 возвращается количество всех простых факторов. function PrimeFactorsCount(n: integer): integer; begin Result := 0; - if n < 2 then Exit; + if n < 2 then exit; var (i, prime, DivIsPrime) := (0, LPrimes[0], True); while Sqr(prime) <= n do begin @@ -898,12 +941,18 @@ begin else if n > 1 then Result += 1 end; -/// Количество простых факторов числа n +/// Количество простых факторов (простых делителей) числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. -/// Для составных чисел при n >= 4 возвращается количество простых делителей. +/// Для составных чисел при n >= 4 возвращается количество всех простых факторов. function PrimeFactorsCount(Self: integer): integer; extensionmethod := PrimeFactorsCount(Self); +/// Разложение числа на простые множители +function Factorize(n: integer): List := PrimeFactors(n); + +/// Разложение числа на простые множители +function Factorize(Self: integer): List; extensionmethod := PrimeFactors(Self); + {$endregion} {$region Digits} diff --git a/bin/Lib/School.pas b/bin/Lib/School.pas index ba0409884..62b739da0 100644 --- a/bin/Lib/School.pas +++ b/bin/Lib/School.pas @@ -1,4 +1,4 @@ -/// Учебный модуль, реализующий базовые алгоритмы информатики (31.07.2024) +/// Учебный модуль, реализующий базовые алгоритмы информатики (01.08.2024) unit School; interface @@ -200,9 +200,6 @@ function LCM(a, b: int64): int64; /// Возвращает НОД и НОК пары чисел function НОДНОК(a, b: int64): (int64, int64); -/// Разложение числа на простые множители -function Factorize(n: integer): List; - /// возвращает True, если число n простое и False в противном случае function IsPrime(n: integer): boolean; @@ -215,16 +212,31 @@ function Primes(m, n: integer): List; /// Первые k простых чисел function FirstPrimes(k: integer): List; -/// Количество простых делителей числа n +/// Разложение числа на простые множители (список всех его простых делителей) +function Factorize(n: integer): List; + +/// Список уникальных простых делителей числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел при n >= 4 возвращается список уникальных простых делителей. +function PrimeDivisors(n: integer): List; + +/// Количество уникальных простых делителей числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. /// Для составных чисел при n >= 4 возвращается количество уникальных простых делителей. function PrimeDivisorsCount(n: integer): integer; -/// Количество простых факторов числа n +/// Список простых факторов (простых делителей) числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел n >= 4 возвращается список всех простых факторов. +function PrimeFactors(n: integer): List; + +/// Количество простых факторов (простых делителей) числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. -/// Для составных чисел при n >= 4 возвращается количество простых делителей. +/// Для составных чисел при n >= 4 возвращается количество всех простых факторов. function PrimeFactorsCount(n: integer): integer; /// Возвращает целочисленный список расширенного представления @@ -677,35 +689,6 @@ end; {$endregion} -{$region Factorize} - -/// Разложение числа n на простые множители -function Factorize(n: integer): List; -begin - n := Abs(n); - Result := new List; - foreach var Divisor in LPrimes do - begin - while (Sqr(Divisor) <= n) and (n >= Divisor) do - if n mod Divisor = 0 then - begin - Result.Add(Divisor); - n := n div Divisor; - end - else - break; - if n < Divisor then - break - end; - Result.Add(n) -end; - -/// Разложение числа на простые множители -function Factorize(Self: integer): List; extensionmethod := -Factorize(Self); - -{$endregion} - {$region Primes} // Внутреняя процедура для заполнения LPrimes @@ -830,7 +813,7 @@ begin begin Result := LPrimes; var kprimes := nPrimeDivs; // количество найденных простых чисел - var n := maxPrimeDiv + 2; // очередной кандидат на простое число + var n := maxPrimeDiv + 2; // очередной кандидат на простое число repeat if n.IsPrime then begin @@ -842,7 +825,38 @@ begin end end; -/// Количество простых делителей числа n +/// Список уникальных простых делителей числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел при n >= 4 возвращается список уникальных простых делителей. +function PrimeDivisors(n: integer): List; +begin + Result := new List; + if n < 2 then exit; + var (i, prime, m) := (0, LPrimes[0], n); + while Sqr(prime) <= n do + begin + if n mod prime = 0 then + begin + Result.Add(prime); + repeat + n := n div prime + until n mod prime <> 0 + end; + Inc(i); + prime := LPrimes[i]; + end; + if Result.Count = 0 then Result.Add(m) + else if n > 1 then Result.Add(n) +end; + +/// Список уникальных простых делителей числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел при n >= 4 возвращается список уникальных простых делителей. +function PrimeDivisors(Self: integer): List; extensionmethod := PrimeDivisors(Self); + +/// Количество уникальных простых делителей числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. /// Для составных чисел при n >= 4 возвращается количество уникальных простых делителей. @@ -868,20 +882,49 @@ begin else if n > 1 then Result += 1 end; -/// Количество простых делителей числа n +/// Количество уникальных простых делителей числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. /// Для составных чисел при n >= 4 возвращается количество уникальных простых делителей. function PrimeDivisorsCount(Self: integer): integer; extensionmethod := PrimeDivisorsCount(Self); -/// Количество простых факторов числа n +/// Список простых факторов (простых делителей) числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел n >= 4 возвращается список всех простых факторов. +function PrimeFactors(n: integer): List; +begin + Result := new List; + if n < 2 then exit; + var (i, prime, m) := (0, LPrimes[0], n); + while Sqr(prime) <= n do + begin + while n mod prime = 0 do + begin + Result.Add(prime); + n := n div prime + end; + Inc(i); + prime := LPrimes[i]; + end; + if Result.Count = 0 then Result.Add(m) + else if n > 1 then Result.Add(n) +end; + +/// Список простых факторов (простых делителей) числа n +/// Для n < 2 возвращается пустой список. +/// Для простого n возвращается список из одного числа n. +/// Для составных чисел n >= 4 возвращается список всех простых факторов. +function PrimeFactors(Self: integer): List; extensionmethod := PrimeFactors(Self); + +/// Количество простых факторов (простых делителей) числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. -/// Для составных чисел при n >= 4 возвращается количество простых делителей. +/// Для составных чисел при n >= 4 возвращается количество всех простых факторов. function PrimeFactorsCount(n: integer): integer; begin Result := 0; - if n < 2 then Exit; + if n < 2 then exit; var (i, prime, DivIsPrime) := (0, LPrimes[0], True); while Sqr(prime) <= n do begin @@ -898,12 +941,18 @@ begin else if n > 1 then Result += 1 end; -/// Количество простых факторов числа n +/// Количество простых факторов (простых делителей) числа n /// Для n < 2 возвращается 0. /// Для простых чисел возвращается 1. -/// Для составных чисел при n >= 4 возвращается количество простых делителей. +/// Для составных чисел при n >= 4 возвращается количество всех простых факторов. function PrimeFactorsCount(Self: integer): integer; extensionmethod := PrimeFactorsCount(Self); +/// Разложение числа на простые множители +function Factorize(n: integer): List := PrimeFactors(n); + +/// Разложение числа на простые множители +function Factorize(Self: integer): List; extensionmethod := PrimeFactors(Self); + {$endregion} {$region Digits}