Кванттық есептеулердің принциптерін ашу

Кванттық есептеулердің принциптерін ашу
«Менің ойымша, ешкім кванттық механиканы түсінбейді деп айта аламын.» - Ричард Фейнман

Кванттық есептеулер тақырыбы әрқашан технологиялық жазушылар мен журналистерді қызықтырды. Оның есептеу әлеуеті мен күрделілігі оған белгілі бір мистикалық аура берді. Көбінесе мақалалар мен инфографика осы саланың әртүрлі перспективаларын егжей-тегжейлі сипаттайды, бірақ оның практикалық қолданылуына әрең тоқталады: бұл аз зейінді оқырманды адастыруы мүмкін.

Танымал ғылыми мақалаларда кванттық жүйелердің сипаттамасы жоқ және келесідей мәлімдемелер жасалады:

Тұрақты бит 1 немесе 0 болуы мүмкін, бірақ кубит бір уақытта 1 және 0 болуы мүмкін.

Егер сіз өте бақытты болсаңыз (мен оған сенімді емеспін), сізге мынаны айтады:

Кубит «1» мен «0» арасындағы суперпозицияда.

Бұл түсініктемелердің ешқайсысы ақылға қонымды болып көрінбейді, өйткені біз өте дәстүрлі әлемде дамыған тілді пайдалана отырып, кванттық механикалық құбылысты тұжырымдауға тырысамыз. Кванттық есептеулердің принциптерін нақты түсіндіру үшін басқа тілді – математикалық тілді қолдану қажет. 

Бұл оқулықта мен кванттық есептеу жүйелерін модельдеу және түсіну үшін қажетті математикалық құралдарды, сондай-ақ кванттық есептеулердің логикасын суреттеу және қолдану жолдарын қарастырамын. Сонымен қатар, мен кванттық алгоритмге мысал келтіремін және оның дәстүрлі компьютерден артықшылығы неде екенін айтамын.

Мен мұның бәрін түсінікті тілмен түсіндіруге бар күшімді саламын, бірақ мен әлі де осы мақаланың оқырмандары сызықтық алгебра және цифрлық логика (сызықтық алгебра қамтылған) туралы негізгі түсінікке ие болады деп үміттенемін. осында, сандық логика туралы - осында). 

Алдымен, сандық логика принциптерін қарастырайық. Ол есептеулерді жүргізу үшін электр тізбектерін пайдалануға негізделген. Сипаттамамызды неғұрлым дерексіз ету үшін электр сымының күйін «қосу» немесе «өшіру» күйлеріне сәйкес келетін «1» немесе «0» күйіне жеңілдетейік. Транзисторларды белгілі бір ретпен орналастыру арқылы біз логикалық элементтер деп аталатын элементтерді жасаймыз, олар бір немесе бірнеше кіріс сигналының мәндерін қабылдайды және оларды логикалық логиканың белгілі бір ережелеріне негізделген шығыс сигналына түрлендіреді.

Кванттық есептеулердің принциптерін ашу

Жалпы логикалық қақпалар және олардың күй кестелері

Осындай негізгі элементтердің тізбегіне сүйене отырып, күрделірек элементтерді құруға болады, ал күрделірек элементтер тізбегіне сүйене отырып, біз түпкілікті абстракцияның үлкен дәрежесімен орталық процессордың аналогын алуды күтуге болады.

Жоғарыда айтқанымдай, бізге сандық логиканы математикалық түрде көрсету тәсілі қажет. Алдымен, математикалық дәстүрлі логиканы енгізейік. Сызықтық алгебраны пайдалана отырып, «1» және «0» мәндері бар классикалық биттерді екі баған векторы ретінде көрсетуге болады:
Кванттық есептеулердің принциптерін ашу
сол жақтағы сандар қайда Дирак белгісі векторы. Біздің биттерді осылай көрсету арқылы біз векторлық түрлендірулерді пайдалана отырып, биттермен логикалық операцияларды модельдей аламыз. Назар аударыңыз: логикалық қақпаларда екі битті пайдалану көптеген операцияларды орындауға болатынымен (ЖӘНЕ, ЕМЕС, XOR және т.б.), бір битті пайдаланған кезде тек төрт операцияны орындауға болады: сәйкестендіруді түрлендіру, теріске шығару, «0» тұрақтысын есептеу және «1» тұрақтысын есептеу. Сәйкестікті түрлендіру кезінде бит өзгеріссіз қалады, терістеу кезінде бит мәні керісінше өзгереді («0»-ден «1»ге дейін немесе «1»-ден «0»ге дейін) және «1» тұрақтысын есептеу немесе «0» биттің алдыңғы мәніне қарамастан «1» немесе «0» мәніне орнатады.
Кванттық есептеулердің принциптерін ашу

Identity Сәйкестікті түрлендіру
Терістеу Бас тарту
Тұрақты-0 «0» тұрақтысын есептеу
Тұрақты-1 «1» тұрақтысын есептеу

Біз ұсынған биттің жаңа көрінісіне сүйене отырып, векторлық түрлендіру арқылы сәйкес битпен операцияларды орындау өте оңай:

Кванттық есептеулердің принциптерін ашу

Әрі қарай қозғалмас бұрын, тұжырымдаманы қарастырайық қайтымды есептеулер, бұл жай ғана операцияның немесе логикалық элементтің қайтымдылығын қамтамасыз ету үшін шығыс сигналдары мен пайдаланылатын операциялардың атауларына негізделген кіріс сигнал мәндерінің тізімін анықтау қажет екенін білдіреді. Осылайша, сәйкестікті түрлендіру және терістеу қайтымды, бірақ «1» және «0» тұрақтыларын есептеу операциялары емес деген қорытынды жасауға болады. Рахмет бірлік кванттық механика, кванттық компьютерлер тек қайтымды операцияларды пайдаланады, сондықтан біз осыған назар аударамыз. Әрі қарай, кванттық компьютерде пайдалану мүмкіндігін беру үшін қайтымсыз элементтерді қайтымды элементтерге айналдырамыз.

Көмегімен тензорлық өнім жеке биттерді көптеген биттермен көрсетуге болады:
Кванттық есептеулердің принциптерін ашу
Енді бізде барлық дерлік қажетті математикалық тұжырымдамалар бар, біз бірінші кванттық логикалық қақпаға көшейік. Бұл оператор ЖОҚ, немесе басқарылатын емес (ЕМЕС), бұл қайтымды және кванттық есептеулерде үлкен маңызға ие. CNOT элементі екі битке қолданылады және екі бит қайтарады. Бірінші бит «басқару» биті, ал екіншісі «басқару» разряды ретінде белгіленеді. Басқару биті «1» күйіне қойылса, басқару разряды оның мәнін өзгертеді; Басқару биті «0» мәніне орнатылса, басқару биті өзгертілмейді.
Кванттық есептеулердің принциптерін ашу
Бұл операторды келесі түрлендіру векторы ретінде көрсетуге болады:
Кванттық есептеулердің принциптерін ашу
Осы уақытқа дейін қарастырғандардың барлығын көрсету үшін мен сізге CNOT элементін бірнеше биттерде қалай пайдалану керектігін көрсетемін:
Кванттық есептеулердің принциптерін ашу
Айтылғандарды қорытындылау үшін: бірінші мысалда |10⟩ оның тензорлық өнімінің бөліктеріне ыдыратамыз және өнімнің жаңа сәйкес күйін алу үшін CNOT матрицасын қолданамыз; біз оны бұрын берілген CNOT мәндерінің кестесіне сәйкес |11⟩ көбейтеміз.

Осылайша, біз дәстүрлі есептеулер мен қарапайым биттерді түсінуге көмектесетін барлық математикалық ережелерді есте сақтадық және ақырында қазіргі кванттық есептеулер мен кубиттерге көшуге болады.

Егер сіз осы уақытқа дейін оқыған болсаңыз, онда менде сізге жақсы жаңалық бар: кубиттерді математикалық түрде оңай көрсетуге болады. Жалпы, егер классикалық бит (кбит) |1⟩ немесе |0⟩ мәніне орнатылса, кубит жай ғана суперпозицияда және өлшеу алдында |0⟩ және |1⟩ болуы мүмкін. Өлшегеннен кейін ол |0⟩ немесе |1⟩ күйіне түседі. Басқаша айтқанда, кубит төмендегі формулаға сәйкес |0⟩ және |1⟩ сызықтық комбинациясы ретінде ұсынылуы мүмкін:
Кванттық есептеулердің принциптерін ашу
қайда a₀ и а₁ сәйкесінше |0⟩ және |1⟩ амплитудаларын білдіреді. Бұларды кубиттің өлшенгеннен кейін күйлердің біріне құлау ықтималдығын білдіретін «кванттық ықтималдықтар» ретінде қарастыруға болады, өйткені кванттық механикада суперпозициядағы объект бекітілгеннен кейін күйлердің біріне құлайды. Осы өрнекті кеңейтіп, келесіні алайық:
Кванттық есептеулердің принциптерін ашу
Түсіндіруімді жеңілдету үшін мен осы мақалада қолданатын өкілдік болып табылады.

Бұл кубит үшін мәнге дейін құлдырау мүмкіндігі a₀ өлшеуден кейін | тең боладыa₀|², және мәнге дейін құлдырау мүмкіндігі a₁ |ге теңa₁|². Мысалы, келесі кубит үшін:
Кванттық есептеулердің принциптерін ашу
"1"-ге құлау мүмкіндігі |1/ √2|² тең, немесе ½, яғни 50/50.

Классикалық жүйеде барлық ықтималдықтар біріне дейін қосылуы керек болғандықтан (толық ықтималдықты бөлу үшін) |0⟩ және |1⟩ амплитудаларының абсолютті мәндерінің квадраттары біреуге дейін қосылуы керек деген қорытынды жасауға болады. Осы мәліметтерге сүйене отырып, келесі теңдеуді құрастыруға болады:
Кванттық есептеулердің принциптерін ашу
Егер сіз тригонометриямен таныс болсаңыз, бұл теңдеу Пифагор теоремасына (a²+b²=c²) сәйкес келетінін байқайсыз, яғни кубиттің мүмкін күйлерін бірлік шеңбердегі нүктелер ретінде графикалық түрде көрсете аламыз, атап айтқанда:
Кванттық есептеулердің принциптерін ашу
Логикалық операторлар мен элементтер матрицалық түрлендіруге негізделген классикалық биттермен жағдайдағыдай кубиттерге қолданылады. Біз осы уақытқа дейін еске түсірген барлық инвертивті матрицалық операторларды, атап айтқанда CNOT, кубиттермен жұмыс істеу үшін пайдаланылуы мүмкін. Мұндай матрицалық операторлар кубиттің әрбір амплитудасын өлшеусіз және тарылтпай пайдалануға мүмкіндік береді. Кубитте терістеу операторын пайдаланудың мысалын келтірейін:
Кванттық есептеулердің принциптерін ашу
Жалғастырмас бұрын, амплитуданың мәні бар екенін еске салайын a₀ және a₁ шын мәнінде күрделі сандар, сондықтан кубит күйін үш өлшемді бірлік сферасына дәлірек көрсетуге болады. Бүрге шары:
Кванттық есептеулердің принциптерін ашу
Дегенмен, түсіндіруді жеңілдету үшін біз мұнда нақты сандармен шектелеміз.

Кванттық есептеулер контекстінде ғана мағынасы бар кейбір логикалық элементтерді талқылайтын уақыт сияқты.

Ең маңызды операторлардың бірі «Хадамард элементі» болып табылады: ол «0» немесе «1» күйінде бит алады және оны «50» немесе «1» күйіне 0% құлау мүмкіндігімен сәйкес суперпозицияға қояды. өлшеуден кейін. 
Кванттық есептеулердің принциптерін ашу
Хадамард операторының төменгі оң жағында теріс сан бар екеніне назар аударыңыз. Бұл операторды қолдану нәтижесі кіріс сигналының мәніне байланысты болатындығына байланысты: - |1⟩ немесе |0⟩, сондықтан есептеу қайтымды.

Хадамард элементінің тағы бір маңызды сәті оның инвертивтілігі болып табылады, яғни ол сәйкес суперпозицияда кубит қабылдай алады және оны |0⟩ немесе |1⟩ түрлендіреді.
Кванттық есептеулердің принциптерін ашу
Бұл өте маңызды, өйткені ол бізге кванттық күйден кубит күйін анықтамай-ақ, сәйкесінше оны құлатпай түрлендіру мүмкіндігін береді. Осылайша, біз кванттық есептеулерді ықтималдық принципіне емес, детерминирленген принципке негіздей аламыз.

Тек нақты сандарды қамтитын кванттық операторлар өздерінің қарама-қарсылары болып табылады, сондықтан операторды кубитке қолдану нәтижесін күй машинасы түріндегі бірлік шеңберінің ішінде түрлендіру ретінде көрсете аламыз:
Кванттық есептеулердің принциптерін ашу
Осылайша, күйі жоғарыдағы диаграммада берілген кубит Хадамард операциясын қолданғаннан кейін сәйкес көрсеткі арқылы көрсетілген күйге түрлендіріледі. Сол сияқты, төменде көрсетілгендей, жоғарыда көрсетілген терістеу операторын (сондай-ақ Паули терістеу операторы немесе биттік инверсия ретінде белгілі) пайдалана отырып, кубит түрлендіруін суреттейтін басқа күй машинасын құра аламыз:
Кванттық есептеулердің принциптерін ашу
Құбитімізде күрделірек операцияларды орындау үшін біз бірнеше операторларды тізбектей аламыз немесе элементтерді бірнеше рет қолдана аламыз. Негізделген сериялық түрлендіру мысалы кванттық контурдың бейнелері төмендегідей:
Кванттық есептеулердің принциптерін ашу
Яғни, егер |0⟩ битінен бастасақ, биттік инверсияны қолдансақ, содан кейін Хадамард операциясын, содан кейін тағы бір биттік инверсияны және қайтадан Хадамард операциясын, соңынан соңғы биттік инверсияны қолдансақ, біз on арқылы берілген вектормен аяқталамыз. тізбектің оң жағы. Әртүрлі күй машиналарын бір-бірінің үстіне қою арқылы біз |0⟩ нүктесінен бастай аламыз және оның барлығы қалай жұмыс істейтінін түсіну үшін түрлендірулердің әрқайсысына сәйкес түсті көрсеткілерді қадағалай аламыз.
Кванттық есептеулердің принциптерін ашу
Біз осы уақытқа дейін келгендіктен, кванттық алгоритмдердің бір түрін қарастыратын кез келді, атап айтқанда - Deutsch-Jozsa алгоритмі, және оның классикалық компьютерден артықшылығын көрсетіңіз. Айта кету керек, Deutsch-Jozsa алгоритмі толығымен детерминирленген, яғни ол дұрыс жауапты 100% уақыт қайтарады (кубиттердің ықтималдық анықтамасына негізделген көптеген басқа кванттық алгоритмдерден айырмашылығы).

Сізде бір битте функция/оператор бар қара жәшік бар деп елестетіп көрейік (есіңізде болсын - бір битпен тек төрт операцияны орындауға болады: сәйкестендіруді түрлендіру, теріске шығару, «0» тұрақтысын бағалау және «1» тұрақтысын бағалау «). Қорапта нақты қандай функция орындалады? Сіз қайсысы екенін білмейсіз, бірақ сіз қалағаныңызша кіріс мәндерінің көптеген нұсқаларын аралап, нәтижелерді бағалай аласыз.

Кванттық есептеулердің принциптерін ашу
Қандай функцияның пайдаланылып жатқанын анықтау үшін қара жәшік арқылы қанша кіріс және шығысты өткізу керек еді? Бұл туралы бір секундқа ойланыңыз.

Классикалық компьютер жағдайында пайдаланылатын функцияны анықтау үшін 2 сұрау жасау қажет болады. Мысалы, егер «1» кірісі «0» шығысын шығарса, «0» тұрақты мәнін есептеу функциясы немесе терістеу функциясы қолданылатыны анық болады, содан кейін кіріс сигналының мәнін өзгертуге тура келеді. «0» мәніне өтіп, шығуда не болатынын көріңіз.

Кванттық компьютер жағдайында екі сұрау да қажет болады, өйткені кіріс мәніне қолданылатын функцияны дәл анықтау үшін сізге әлі екі түрлі шығыс мәні қажет. Дегенмен, егер сіз сұрақты аздап қайта тұжырымдасаңыз, кванттық компьютерлердің әлі де маңызды артықшылығы бар екен: егер сіз қолданылатын функцияның тұрақты немесе айнымалы екенін білгіңіз келсе, кванттық компьютерлердің артықшылығы болады.

Егер кіріс сигналының әртүрлі мәндері шығыста әртүрлі нәтижелер берсе (мысалы, сәйкестендіруді түрлендіру және бит инверсиясы) және шығыс мәні кіріс мәніне қарамастан өзгермесе, қорапта қолданылатын функция айнымалы болып табылады. функциясы тұрақты (мысалы, «1» тұрақтысын есептеу немесе «0» тұрақтысын есептеу).

Кванттық алгоритмді пайдалана отырып, қара жәшіктегі функцияның бір ғана сұрау негізінде тұрақты немесе айнымалы екенін анықтауға болады. Бірақ мұны қалай жасауға болатынын егжей-тегжейлі қарастырмас бұрын, кванттық компьютерде осы функциялардың әрқайсысын құрылымдау жолын табу керек. Кез келген кванттық операторлар инверсиялық болуы керек болғандықтан, біз бірден мәселеге тап боламыз: «1» және «0» тұрақтыларын есептеу функциялары жоқ.

Кванттық есептеулерде қолданылатын жалпы шешім функция алатын кез келген кіріс мәнін қайтаратын қосымша шығыс кубитін қосу болып табылады. 

Бұрын: Кейін:
Кванттық есептеулердің принциптерін ашу Кванттық есептеулердің принциптерін ашу

Осылайша, біз кіріс мәндерін тек шығыс мәніне негізделген анықтай аламыз және функция инвертивті болады. Кванттық тізбектердің құрылымы қосымша кіріс битінің қажеттілігін тудырады. Сәйкес операторларды дамыту үшін қосымша кіріс кубиті |0⟩ мәніне орнатылған деп есептейміз.

Біз бұрын қолданған кванттық схеманың көрінісін пайдалана отырып, төрт элементтің әрқайсысын (тұлғаны түрлендіру, терістеу, «0» тұрақтысын бағалау және «1» тұрақтысын бағалау) кванттық операторлар арқылы қалай жүзеге асыруға болатынын көрейік. 

Мысалы, «0» тұрақты мәнін есептеу функциясын осылай жүзеге асыруға болады:

«0» тұрақтысын есептеу:
Кванттық есептеулердің принциптерін ашу
Бұл жерде бізге операторлар мүлдем қажет емес. Бірінші кіріс кубиті (біз |0⟩ деп есептедік) бірдей мәнмен қайтарылады, ал екінші кіріс мәні әдеттегідей өзін қайтарады.

«1» тұрақты мәнін есептеу функциясымен жағдай сәл басқаша:

«1» тұрақтысын есептеу:
Кванттық есептеулердің принциптерін ашу
Бірінші кіріс кубиті әрқашан |0⟩ мәніне орнатылады деп болжағандықтан, биттік инверсия операторын қолдану нәтижесі ол әрқашан шығыста бірді шығарады. Әдеттегідей, екінші кубит шығыста өз мәнін береді.

Сәйкестікті түрлендіру операторын салыстыру кезінде тапсырма күрделене бастайды. Мұны қалай істеу керек:

Бірдей түрлендіру:
Кванттық есептеулердің принциптерін ашу
Мұнда қолданылатын таңба CNOT элементін білдіреді: жоғарғы жол басқару битін, ал төменгі жол басқару битін білдіреді. CNOT операторын пайдалану кезінде басқару разрядының мәні |1⟩ тең болса, басқару разрядының мәні өзгеретінін, ал басқару биті |0⟩ тең болса, өзгеріссіз қалатынын еске саламын. Жоғарғы жолдың мәні әрқашан |0⟩ тең деп есептегендіктен, оның мәні әрқашан төменгі жолға тағайындалады.

Терістеу операторымен ұқсас жолмен жүреміз:

Бас тарту:
Кванттық есептеулердің принциптерін ашу
Біз шығыс сызығының соңындағы битті жай ғана төңкереміз.

Енді біз бұл алдын ала түсінікті алғаннан кейін, бір ғана сұрауды пайдалана отырып, қара жәшікте жасырылған функцияның тұрақтылығын немесе өзгермелілігін анықтауға келгенде, кванттық компьютердің дәстүрлі компьютерге қарағанда ерекше артықшылықтарын қарастырайық.

Бұл мәселені бір сұраныста кванттық есептеулерді қолдану арқылы шешу үшін төменде көрсетілгендей, кіріс кубиттерін функцияға бермес бұрын оларды суперпозицияға қою керек:
Кванттық есептеулердің принциптерін ашу
Хадамард элементі кубиттерді суперпозициядан шығару және алгоритмді детерминирленген ету үшін функцияның нәтижесіне қайта қолданылады. Біз жүйені |00⟩ күйінде бастаймыз және мен қысқаша түсіндіретін себептерге байланысты қолданылған функция тұрақты болса |11⟩ нәтижесін аламыз. Қара жәшік ішіндегі функция айнымалы болса, өлшеуден кейін жүйе |01⟩ нәтижесін береді.

Мақаланың қалған бөлігін түсіну үшін мен бұрын көрсеткен суретті қарастырайық:
Кванттық есептеулердің принциптерін ашу
Битті инверсия операторын пайдаланып, содан кейін |0⟩ мәніне тең кіріс мәндерінің екеуіне де Hadamard элементін қолдану арқылы біз олардың |0⟩ және |1⟩ бірдей суперпозициясына келесідей аударылуын қамтамасыз етеміз:
Кванттық есептеулердің принциптерін ашу
Бұл мәнді қара жәшік функциясына беру мысалын пайдаланып, екі тұрақты мән функциясының да |11⟩ шығатынын көрсету оңай.

«0» тұрақтысын есептеу:
Кванттық есептеулердің принциптерін ашу
Сол сияқты, «1» тұрақтысын есептеу функциясы да |11⟩ шығысын шығаратынын көреміз, яғни:

«1» тұрақтысын есептеу:
Кванттық есептеулердің принциптерін ашу
Шығару |1⟩ болатынын ескеріңіз, өйткені -1² = 1.

Дәл сол принцип бойынша біз айнымалы функциялардың екеуін де пайдаланған кезде біз әрқашан шығыста |01⟩ алатынымызды дәлелдей аламыз (егер біз бір әдісті қолдансақ), бәрі біршама күрделірек.

Бірдей түрлендіру:
Кванттық есептеулердің принциптерін ашу
CNOT екі кубитті оператор болғандықтан, оны жай күй машинасы ретінде көрсету мүмкін емес, сондықтан кіріс кубиттерінің тензорлық өніміне және бұрын сипатталғандай CNOT матрицасына көбейтуге негізделген екі шығыс сигналын анықтау қажет:
Кванттық есептеулердің принциптерін ашу
Бұл әдіс арқылы біз қара жәшікте терістеу функциясы жасырылған болса, |01⟩ шығыс мәні алынғанын растай аламыз:

Бас тарту:
Кванттық есептеулердің принциптерін ашу
Осылайша, біз жай ғана кванттық компьютер әдеттегі компьютерге қарағанда тиімдірек болатын жағдайды көрсеттік.

Келесі не?

Мен осы жерде аяқтауды ұсынамын. Біз қазірдің өзінде тамаша жұмыс жасадық. Егер сіз мен қарастырғандардың барлығын түсінген болсаңыз, менің ойымша, сіз қазір кванттық есептеу және кванттық логика негіздерін жақсы түсіндіңіз және неге кванттық алгоритмдер белгілі бір жағдайларда дәстүрлі есептеулерге қарағанда тиімдірек болуы мүмкін.

Менің сипаттаманы кванттық есептеулер мен алгоритмдерге толыққанды нұсқаулық деп атауға болмайды - бұл, керісінше, танымал ғылыми көздер жүктеген пән туралы оқырмандардың идеяларын жоққа шығаруға арналған математика мен нотацияға қысқаша кіріспе (байыпты, көпшілігі шынымен мүмкін емес. жағдайды түсініңіз!). сияқты көптеген маңызды тақырыптарды қозғап үлгермедім кубиттердің кванттық түйісуі, |0⟩ және |1⟩ амплитудалық мәндерінің күрделілігі және Блох сферасы арқылы түрлендіру кезінде әртүрлі кванттық логикалық элементтердің жұмыс істеуі.

Егер сіз кванттық компьютерлер туралы біліміңізді жүйелеп, құрылымдағыңыз келсе, шұғыл Мен сізге оқуға кеңес беремін «Кванттық алгоритмдерге кіріспе» Эмма Струбель: математикалық формулалардың көптігіне қарамастан, бұл кітапта кванттық алгоритмдер әлдеқайда егжей-тегжейлі қарастырылады.

Ақпарат көзі: www.habr.com

пікір қалдыру