diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index e74c637f2..008cca7ec 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 = "6"; public const string Build = "2"; - public const string Revision = "2403"; + public const string Revision = "2414"; 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 4d5321a0d..0a285f104 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=6 -%REVISION%=2403 %COREVERSION%=2 +%REVISION%=2414 +%MINOR%=6 %MAJOR%=3 diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 95713ea0b..814282acf 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.6.2.2403 +3.6.2.2414 diff --git a/ReleaseGenerators/DotNet40.nsh b/ReleaseGenerators/DotNet40.nsh index 52f7a9e88..78b61eaee 100644 --- a/ReleaseGenerators/DotNet40.nsh +++ b/ReleaseGenerators/DotNet40.nsh @@ -5,26 +5,23 @@ SectionGroup "Microsoft .NET Framework" _DOTNET Section "Microsoft .NET Framework 4.0" Framework SectionIn 1 2 -; IfFileExists "$WINDIR\Microsoft.NET\Framework\v2.0.50727\System.dll" +3 0 -; MessageBox MB_YESNO "Для работы компилятора необходима платформа Microsoft .NET версии 2.0 либо выше. Установить платформу Microsoft .NET Framework 2.0?" IDYES insalldotnet -; Goto notinsalldotnet -; Goto dotnetinstalled - IfFileExists "$WINDIR\Microsoft.NET\Framework\v4.0.30319\System.dll" 0 +2 - ;ReadRegDWORD $1 HKLM "Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" "SP" - ;IntCmp $1 2 dotnetinstalled installdotnet dotnetinstalled - Goto dotnetinstalled - installdotnet: - SetOutPath "$INSTDIR" - File "DotNet40\${WindowsInstallerPath}" - ExecWait '"$INSTDIR\${WindowsInstallerPath}" /Quiet /Norestart' - Delete "$INSTDIR\${WindowsInstallerPath}" - File "DotNet40\${DotNet}" - ExecWait '"$INSTDIR\${DotNet}" /Q' - Delete "$INSTDIR\${DotNet}" - Goto exit - dotnetinstalled: - ;MessageBox MB_OK "Платформа Microsoft .NET версии 4.0 уже установлена на этом компьютере." - exit: +!insertmacro CheckNetFramework 40Full +; IfFileExists "$WINDIR\Microsoft.NET\Framework\v4.0.30319\System.dll" 0 +2 +; ;ReadRegDWORD $1 HKLM "Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" "SP" +; ;IntCmp $1 2 dotnetinstalled installdotnet dotnetinstalled +; Goto dotnetinstalled +; installdotnet: +; SetOutPath "$INSTDIR" +; File "DotNet40\${WindowsInstallerPath}" +; ExecWait '"$INSTDIR\${WindowsInstallerPath}" /Quiet /Norestart' +; Delete "$INSTDIR\${WindowsInstallerPath}" +; File "DotNet40\${DotNet}" +; ExecWait '"$INSTDIR\${DotNet}" /Q' +; Delete "$INSTDIR\${DotNet}" +; Goto exit +; dotnetinstalled: +; ;MessageBox MB_OK "Платформа Microsoft .NET версии 4.0 уже установлена на этом компьютере." +; exit: SectionEnd Section "Russian Language Pack" LangPack SectionIn 1 diff --git a/ReleaseGenerators/DotNet47.nsh b/ReleaseGenerators/DotNet47.nsh index 21919569b..e52a30629 100644 --- a/ReleaseGenerators/DotNet47.nsh +++ b/ReleaseGenerators/DotNet47.nsh @@ -3,19 +3,20 @@ SectionGroup "Microsoft .NET Framework" _DOTNET Section "Microsoft .NET Framework 4.7" Framework SectionIn 1 2 - IfFileExists "$WINDIR\Microsoft.NET\Framework\v4.0.30319\System.dll" 0 +2 - ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release" - IntCmp $1 460805 dotnetinstalled installdotnet dotnetinstalled - Goto dotnetinstalled - installdotnet: - SetOutPath "$INSTDIR" - File "DotNet471\${DotNet}" - ExecWait '"$INSTDIR\${DotNet}" /Q' - Delete "$INSTDIR\${DotNet}" - Goto exit - dotnetinstalled: - ;MessageBox MB_OK "Платформа Microsoft .NET версии 4.0 уже установлена на этом компьютере." - exit: + !insertmacro CheckNetFramework 471 +; IfFileExists "$WINDIR\Microsoft.NET\Framework\v4.0.30319\System.dll" 0 +2 +; ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release" +; IntCmp $1 460805 dotnetinstalled installdotnet dotnetinstalled +; Goto dotnetinstalled +; installdotnet: +; SetOutPath "$INSTDIR" +; File "DotNet471\${DotNet}" +; ExecWait '"$INSTDIR\${DotNet}" /Q' +; Delete "$INSTDIR\${DotNet}" +; Goto exit +; dotnetinstalled: +; ;MessageBox MB_OK "Платформа Microsoft .NET версии 4.7.1 уже установлена на этом компьютере." +; exit: SectionEnd Section "Framework Class Library Help" FrameworkHelp SectionIn 1 diff --git a/ReleaseGenerators/DotNetChecker.nsh b/ReleaseGenerators/DotNetChecker.nsh index 34ef1a636..4c6ad98a6 100644 --- a/ReleaseGenerators/DotNetChecker.nsh +++ b/ReleaseGenerators/DotNetChecker.nsh @@ -71,7 +71,7 @@ StrCpy $dotNetReadableVersion${FrameworkVersion} "1.0" ${EndIf} - DetailPrint "Checking .NET Framework version..." + DetailPrint "Проверка версии .NET Framework..." Push $0 Push $1 @@ -87,48 +87,48 @@ ${If} $0 == "false" ${OrIf} $0 == "f" ; if script is compiled in ANSI mode then we get only an "f" https://github.com/ReVolly/NsisDotNetChecker/issues/4 - DetailPrint ".NET Framework $dotNetReadableVersion${FrameworkVersion} not found, download is required for program to run." + DetailPrint ".NET Framework $dotNetReadableVersion${FrameworkVersion} не найдена, требуется установить перед инсталляцией PascalABC.NET." Goto NoDotNET${FrameworkVersion} ${Else} - DetailPrint ".NET Framework $dotNetReadableVersion${FrameworkVersion} found, no need to install." + DetailPrint ".NET Framework $dotNetReadableVersion${FrameworkVersion} найдена, нет необходимости инсталлировать." Goto NewDotNET${FrameworkVersion} ${EndIf} NoDotNET${FrameworkVersion}: MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ - ".NET Framework not installed. Required version: $dotNetReadableVersion${FrameworkVersion}.$\nDownload .NET Framework $dotNetReadableVersion${FrameworkVersion} from microsoft.com?" \ + ".NET Framework не установлена. Требуемая версия: $dotNetReadableVersion${FrameworkVersion}.$\nЗагрузить .NET Framework $dotNetReadableVersion${FrameworkVersion} с microsoft.com?" \ /SD IDYES IDYES DownloadDotNET${FrameworkVersion} IDNO NewDotNET${FrameworkVersion} goto GiveUpDotNET${FrameworkVersion} ;IDCANCEL DownloadDotNET${FrameworkVersion}: - DetailPrint "Beginning download of .NET Framework $dotNetReadableVersion${FrameworkVersion}." + DetailPrint "Начало скачивания .NET Framework $dotNetReadableVersion${FrameworkVersion}." NSISDL::download $dotNetUrl${FrameworkVersion} "$TEMP\dotnetfx.exe" - DetailPrint "Completed download." + DetailPrint "Скачивание окончено." Pop $0 ${If} $0 == "cancel" MessageBox MB_YESNO|MB_ICONEXCLAMATION \ - "Download canceled. Continue Installation?" \ + "Скачивание отменено. Продолжить инсталляцию?" \ IDYES NewDotNET${FrameworkVersion} IDNO GiveUpDotNET${FrameworkVersion} ${ElseIf} $0 != "success" MessageBox MB_YESNO|MB_ICONEXCLAMATION \ - "Download failed:$\n$0$\n$\nContinue Installation?" \ + "Скачивание завершилось неудачей:$\n$0$\n$\nПродолжить инсталляцию?" \ IDYES NewDotNET${FrameworkVersion} IDNO GiveUpDotNET${FrameworkVersion} ${EndIf} - DetailPrint "Pausing installation while downloaded .NET Framework installer runs." + DetailPrint "Пауза инсталляции PascalABC.NET пока запущен инсталлятор .NET Framework." ExecWait '$TEMP\dotnetfx.exe /q /c:"install /q"' - DetailPrint "Completed .NET Framework install/update. Removing .NET Framework installer." + DetailPrint "Завершена инсталляция .NET Framework. Удаляется .NET Framework инсталлятор." Delete "$TEMP\dotnetfx.exe" - DetailPrint ".NET Framework installer removed." + DetailPrint ".NET Framework инсталлятор удалён." goto NewDotNet${FrameworkVersion} GiveUpDotNET${FrameworkVersion}: - Abort "Installation canceled by user." + Abort "Инсталляция прервана пользователем." NewDotNET${FrameworkVersion}: - DetailPrint "Proceeding with remainder of installation." + DetailPrint "Переход к оставшейся части установки." Pop $7 Pop $6 Pop $5 diff --git a/ReleaseGenerators/PascalABCNETStandart.nsi b/ReleaseGenerators/PascalABCNETStandart.nsi index 235421773..bc1629d31 100644 --- a/ReleaseGenerators/PascalABCNETStandart.nsi +++ b/ReleaseGenerators/PascalABCNETStandart.nsi @@ -1,6 +1,8 @@ SetCompressor /SOLID lzma OutFile "..\Release\PascalABCNETSetup.exe" !include PascalABCNET_head.nsh +!include DotNetChecker.nsh +!include DotNet47.nsh !include PascalABCNET_sections.nsh !include PascalABCNET_end.nsh !include "nsProcess.nsh" diff --git a/ReleaseGenerators/PascalABCNETWithDotNet.nsi b/ReleaseGenerators/PascalABCNETWithDotNet.nsi index b87b8f665..b2af3dd21 100644 --- a/ReleaseGenerators/PascalABCNETWithDotNet.nsi +++ b/ReleaseGenerators/PascalABCNETWithDotNet.nsi @@ -1,6 +1,7 @@ -SetCompressor bzip2 +SetCompressor /SOLID lzma OutFile "..\Release\PascalABCNETWithDotNetSetup.exe" !include PascalABCNET_head.nsh +!include DotNetChecker.nsh !include DotNet47.nsh ;!include DotNetHelp.nsh !include PascalABCNET_sections.nsh diff --git a/ReleaseGenerators/PascalABCNETWithDotNet40.nsi b/ReleaseGenerators/PascalABCNETWithDotNet40.nsi index 2ae198eda..bb1a8f971 100644 --- a/ReleaseGenerators/PascalABCNETWithDotNet40.nsi +++ b/ReleaseGenerators/PascalABCNETWithDotNet40.nsi @@ -1,6 +1,7 @@ -SetCompressor bzip2 +SetCompressor /SOLID lzma OutFile "..\Release\PascalABCNETWithDotNet40Setup.exe" !include PascalABCNET_head.nsh +!include DotNetChecker.nsh !include DotNet40.nsh ;!include DotNetHelp.nsh !include PascalABCNET_sections.nsh diff --git a/ReleaseGenerators/PascalABCNET_ALL.bat b/ReleaseGenerators/PascalABCNET_ALL.bat index 08da77e81..b56fcaf6a 100644 --- a/ReleaseGenerators/PascalABCNET_ALL.bat +++ b/ReleaseGenerators/PascalABCNET_ALL.bat @@ -1,5 +1,6 @@ "..\utils\NSIS\Unicode\makensis.exe" PascalABCNETMini.nsi "..\utils\NSIS\Unicode\makensis.exe" PascalABCNETStandart.nsi -"..\utils\NSIS\Unicode\makensis.exe" PascalABCNETWithDotNet.nsi +copy ..\Release\PascalABCNETSetup.exe ..\Release\PascalABCNETWithDotNetSetup.exe +rem "..\utils\NSIS\Unicode\makensis.exe" PascalABCNETWithDotNet.nsi PascalABCNETConsoleZIP.bat -PascalABCNETMonoZIP.bat \ No newline at end of file +rem PascalABCNETMonoZIP.bat \ No newline at end of file diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index b9544234a..983a01b35 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.6.2.2403' +!define VERSION '3.6.2.2414' diff --git a/ReleaseGenerators/RebuildStandartModules.pas b/ReleaseGenerators/RebuildStandartModules.pas index d09c24b0d..52d5c5b3e 100644 --- a/ReleaseGenerators/RebuildStandartModules.pas +++ b/ReleaseGenerators/RebuildStandartModules.pas @@ -15,7 +15,7 @@ ABCDatabases,BlockFileOfT,Controls, OpenCL, OpenCLABC, OpenGL, OpenGLABC, - BBCMicroBit + BBCMicroBit, School, SF ; begin diff --git a/ReleaseGenerators/sect_Core.nsh b/ReleaseGenerators/sect_Core.nsh index d6d3fa6af..c85d2b535 100644 --- a/ReleaseGenerators/sect_Core.nsh +++ b/ReleaseGenerators/sect_Core.nsh @@ -132,6 +132,8 @@ File ..\bin\Lib\OpenCLABC.pcu File ..\bin\Lib\OpenGL.pcu File ..\bin\Lib\OpenGLABC.pcu + File ..\bin\Lib\School.pcu + File ..\bin\Lib\SF.pcu File ..\bin\Lib\PABCRtl.dll File ..\bin\Lib\HelixToolkit.Wpf.dll @@ -198,6 +200,9 @@ ${AddFile} "OpenCLABC.pcu" ${AddFile} "OpenGL.pcu" ${AddFile} "OpenGLABC.pcu" + ${AddFile} "School.pcu" + ${AddFile} "SF.pcu" + ${AddFile} "PABCRtl.dll" ${AddFile} "HelixToolkit.Wpf.dll" ${AddFile} "HelixToolkit.dll" @@ -274,6 +279,9 @@ File ..\bin\Lib\OpenCLABC.pas File ..\bin\Lib\OpenGL.pas File ..\bin\Lib\OpenGLABC.pas + File ..\bin\Lib\School.pas + File ..\bin\Lib\SF.pas + File ..\bin\Lib\__RedirectIOMode.vb File ..\bin\Lib\VBSystem.vb @@ -336,6 +344,9 @@ ${AddFile} "OpenCLABC.pas" ${AddFile} "OpenGL.pas" ${AddFile} "OpenGLABC.pas" + ${AddFile} "School.pas" + ${AddFile} "SF.pas" + ${AddFile} "__RedirectIOMode.vb" ${AddFile} "VBSystem.vb" diff --git a/ReleaseGenerators/sect_VisualPABCNET.nsh b/ReleaseGenerators/sect_VisualPABCNET.nsh index adce630e3..7241ce4a3 100644 --- a/ReleaseGenerators/sect_VisualPABCNET.nsh +++ b/ReleaseGenerators/sect_VisualPABCNET.nsh @@ -17,7 +17,7 @@ File "..\bin\samples.pct" File "..\bin\school.pct" File "..\bin\Pause.exe" - File "..\bin\nuget.exe" + ;File "..\bin\nuget.exe" File "..\bin\FormatterOptions.ini" File "..\bin\ProgrammRunner.exe" File "..\bin\pabcworknet.ini" @@ -39,7 +39,7 @@ ${AddFile} "samples.pct" ${AddFile} "school.pct" ${AddFile} "Pause.exe" - ${AddFile} "nuget.exe" + ;${AddFile} "nuget.exe" ${AddFile} "FormatterOptions.ini" ${AddFile} "ProgrammRunner.exe" diff --git a/TestSuite/PlusIfOp.pas b/TestSuite/PlusIfOp.pas index 08557bdb4..c270de3a3 100644 --- a/TestSuite/PlusIfOp.pas +++ b/TestSuite/PlusIfOp.pas @@ -1,5 +1,5 @@ begin - var a := 2 + if true then 2 else 3; + Print(if true then 2 else 3 + if true then 2 else 3); var b := 2 * if true then 2 else 3; var c := 2 < if true then 2 else 3; end. \ No newline at end of file diff --git a/Utils/NSIS/Plugins/DotNetChecker.dll b/Utils/NSIS/Plugins/DotNetChecker.dll new file mode 100644 index 000000000..46f5515b8 Binary files /dev/null and b/Utils/NSIS/Plugins/DotNetChecker.dll differ diff --git a/bin/Lib/School.pas b/bin/Lib/School.pas new file mode 100644 index 000000000..d260fe1b2 --- /dev/null +++ b/bin/Lib/School.pas @@ -0,0 +1,377 @@ +unit School; + +interface + +/// Перевод десятичного числа в двоичную систему счисления +function Bin(x: int64): string; + +/// Перевод десятичного числа в двоичную систему счисления +function Bin(x: BigInteger): string; + +/// Перевод десятичного числа в восьмеричную систему счисления +function Oct(x: int64): string; + +/// Перевод десятичного числа в восьмеричную систему счисления +function Oct(x: BigInteger): string; + +/// Перевод десятичного числа в шестнадцатиричную систему счисления +function Hex(x: int64): string; + +/// Перевод десятичного числа в шестнадцатиричную систему счисления +function Hex(x: BigInteger): string; + +/// Перевод из системы по основанию base [2..36] в десятичную +function Dec(s: string; base: integer): int64; + +/// Перевод из системы по основанию base [2..36] в десятичную +function DecBig(s: string; base: integer): BigInteger; + +/// Возвращает кортеж из минимума и максимума последовательности s +function MinMax(s: sequence of int64): (int64, int64); + +/// Возвращает кортеж из минимума и максимума последовательности s +function MinMax(s: sequence of integer): (integer, integer); + +/// Ввозвращает НОД и НОК пары чисел +function НОДНОК(a, b: int64): (int64, int64); + +/// Разложение числа на простые множители +function Factorize(n: int64): array of int64; + +/// Рразложение числа на простые множители +function Factorize(n: integer): array of integer; + +/// Простые числа на интервале [2;n] +function Primes(n: integer): array of integer; + +/// Первые n простых чисел +function FirstPrimes(n: integer): array of integer; + +/// Возвращает массив, содержащий цифры числа +function Digits(n: int64): array of integer; + +implementation + +type + School_BadCharInString = class(Exception) + end; + + School_InvalidBase = class(Exception) + end; + +{$region Bin} + +function Bin(x: int64): string; +begin + x := Abs(x); + var r := ''; + while x >= 2 do + (r, x) := (x mod 2 + r, x Shr 1); + Result := x + r +end; + +function Bin(x: BigInteger): string; +begin + x := Abs(x); + var r := ''; + while x >= 2 do + (r, x) := (byte(x mod 2) + r, x div 2); + Result := byte(x) + r +end; + +{$region} + +{$region Oct} + +function Oct(x: int64): string; +begin + x := Abs(x); + var r := ''; + while x >= 8 do + (r, x) := (x mod 8 + r, x Shr 3); + Result := x + r +end; + +function Oct(x: BigInteger): string; +begin + x := Abs(x); + var r := ''; + while x >= 8 do + (r, x) := (byte(x mod 8) + r, x div 8); + Result := byte(x) + r +end; + +{$region} + + +{$region Hex} +function Hex(x: int64): string; +begin + x := Abs(x); + var s := '0123456789ABCDEF'; + var r := ''; + while x >= 16 do + (r, x) := (s[x mod 16 + 1] + r, x Shr 4); + Result := s[x + 1] + r +end; + +function Hex(x: BigInteger): string; +begin + x := Abs(x); + var s := '0123456789ABCDEF'; + var r := ''; + while x >= 16 do + (r, x) := (s[byte(x mod 16) + 1] + r, x div 16); + Result := s[byte(x) + 1] + r +end; + +{$region} + +{$region Dec} + +function Dec(s: string; base: integer): int64; +begin + if not (base in 2..36) then + raise new School_InvalidBase + ($'ToDecimal: Недопустимое основание {base}'); + var sb := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + s := s.ToUpper; + var r := s.Except(sb[:base + 1]).JoinToString; + if r.Length > 0 then + raise new School_BadCharInString + ($'ToDecimal: Недопустимый символ "{r}" в строке {s}'); + var (pa, p) := (BigInteger.One, BigInteger.Zero); + foreach var c in s.Reverse do + begin + var i := Pos(c, sb) - 1; + p += pa * i; + pa *= base + end; + Result := int64(p) +end; + +function DecBig(s: string; base: integer): BigInteger; +begin + if not (base in 2..36) then + raise new School_InvalidBase + ($'ToDecimal: Недопустимое основание {base}'); + var sb := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + s := s.ToUpper; + var r := s.Except(sb[:base + 1]).JoinToString; + if r.Length > 0 then + raise new School_BadCharInString + ($'ToDecimal: Недопустимый символ "{r}" в строке {s}'); + var pa := BigInteger.One; + Result := BigInteger.Zero; + foreach var c in s.Reverse do + begin + var i := Pos(c, sb) - 1; + Result += pa * i; + pa *= base + end +end; + +{$region} + +{$region MinMax} + +/// Возвращает кортеж из минимума и максимума последовательности s +function MinMax(s: sequence of int64): (int64, int64); +begin + var (min, max) := (int64.MaxValue, int64.MinValue); + foreach var m in s do + if m < min then + min := m + else if m > max then + max := m; + Result := (min, max) +end; + +/// Возвращает кортеж из минимума и максимума последовательности s +function MinMax(s: sequence of integer): (integer, integer); +begin + var (min, max) := (integer.MaxValue, integer.MinValue); + foreach var m in s do + if m < min then + min := m + else if m > max then + max := m; + Result := (min, max) +end; + +/// Возвращает кортеж из минимума и максимума последовательности +function MinMax(Self: sequence of int64): (int64, int64); extensionmethod := + MinMax(Self); + +/// Возвращает кортеж из минимума и максимума последовательности +function MinMax(Self: sequence of integer): (integer, integer); + extensionmethod := MinMax(Self); + +{$region} + +{$region НОДНОК} + +/// Возвращает НОД и НОК пары чисел +function НОДНОК(a, b: int64): (int64, int64); +begin + (a, b) := (Abs(a), Abs(b)); + var (a1, b1) := (a, b); + while b <> 0 do + (a, b) := (b, a mod b); + Result := (a, a1 div a * b1) +end; + +{$region} + +{$region Factorize} + +/// Разложение числа на простые множители +function Factorize(n: int64): array of int64; +begin + n := Abs(n); + var i: int64 := 2; + var L := new List; + while i * i <= n do + if n mod i = 0 then + begin + L.Add(i); + n := n div i; + if n < i then + break + end + else + i += i = 2 ? 1 : 2; + if n > 1 then + L.Add(n); + Result := L.ToArray +end; + +/// Разложение числа на простые множители +function Factorize(n: integer): array of integer; +begin + n := Abs(n); + var i := 2; + var L := new List; + while i * i <= n do + if n mod i = 0 then + begin + L.Add(i); + n := n div i; + if n < i then + break + end + else + i += i = 2 ? 1 : 2; + if n > 1 then + L.Add(n); + Result := L.ToArray +end; + +/// разложение числа на простые множители +function Factorize(Self: int64): array of int64; extensionmethod := + Factorize(Self); + +/// Разложение числа на простые множители +function Factorize(Self: integer): array of integer; extensionmethod := + Factorize(Self); + +{$region} + +{$region Primes} + +/// Простые числа на интервале [2;n] +function Primes(n: integer): array of integer; +// Модифицированное решето Эратосфена на [2;n] +begin + var Mas := ArrFill(n, True); + var i := 2; + while i * i <= n do + begin + if Mas[i-1] then + begin + var k := i*i; + while k <= n do + begin + Mas[k-1] := False; + k += i + end + end; + Inc(i) + end; + n := Mas.Count(t -> t); + Result := new integer[n-1]; + i := 0; + for var j := 1 to Mas.High do + if Mas[j] then + begin + Result[i] := j+1; + Inc(i) + end +end; + +/// Первые n простых чисел +function FirstPrimes(n: integer): array of integer; +// Модифицированное решето Эратосфена +begin + var n1 := Trunc(Exp((Ln(n)+1.088)/0.8832)); + var Mas := ArrFill(n1, True); + var i := 2; + while i * i <= n1 do + begin + if Mas[i-1] then + begin + var k := i*i; + while k <= n1 do + begin + Mas[k-1] := False; + k += i + end + end; + Inc(i) + end; + //n := Mas.Count(t -> t); + Result := new integer[n]; + i := 0; + for var j := 1 to Mas.High do + if Mas[j] then + begin + Result[i] := j+1; + Inc(i); + if i = n then + break + end +end; + +{$region} + +{$region Digits} + +/// Возвращает массив, содержащий цифры числа +function Digits(n: int64): array of integer; +begin + var St := new Stack; + n := Abs(n); + if n = 0 then + Result := Arr(0) + else + begin + while n > 0 do + begin + St.Push(n mod 10); + n := n div 10 + end; + Result := St.ToArray + end +end; + +/// Возвращает массив, содержащий цифры числа +function Digits(Self: integer): array of integer; + extensionmethod := Digits(Self); + +/// возвращает массив, содержащий цифры числа +function Digits(Self: int64): array of integer; + extensionmethod := Digits(Self); + +{$region} + +end. \ No newline at end of file