সংখ্যাটি নিখুঁত বর্গক্ষেত্র কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
গতি কোনও উদ্বেগের বিষয় নয়, আপাতত সবে কাজ করছে।
সংখ্যাটি নিখুঁত বর্গক্ষেত্র কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
গতি কোনও উদ্বেগের বিষয় নয়, আপাতত সবে কাজ করছে।
উত্তর:
কোনও ভাসমান পয়েন্ট গণনা ( math.sqrt(x)
, বা x**0.5
) এর উপর নির্ভর করার সমস্যাটি হ'ল আপনি সত্যই নিশ্চিত হতে পারবেন না যে এটি সঠিক (যথেষ্ট পরিমাণে পূর্ণ সংখ্যার জন্য x
, এটি হবে না এবং এমনকি উপচেও যেতে পারে)। ভাগ্যক্রমে (যদি কোনও তাড়াহুড়ো না করে ;-) অনেকগুলি খাঁটি পূর্ণসংখ্যা রয়েছে, যেমন নীচের ...:
def is_square(apositiveint):
x = apositiveint // 2
seen = set([x])
while x * x != apositiveint:
x = (x + (apositiveint // x)) // 2
if x in seen: return False
seen.add(x)
return True
for i in range(110, 130):
print i, is_square(i)
ইঙ্গিত: এটি স্কোয়ার রুটের জন্য "ব্যাবিলনীয় অ্যালগরিদম" এর উপর ভিত্তি করে উইকিপিডিয়া দেখুন । এটা তোলে করেন কোন ধনাত্মক সংখ্যা যার জন্য আপনি গণনার সমাপ্তির এগিয়ে যেতে জন্য ;-) পর্যাপ্ত মেমরি আছে তাদের জন্য হবে।
সম্পাদনা : আসুন একটি উদাহরণ দেখুন ...
x = 12345678987654321234567 ** 2
for i in range(x, x+2):
print i, is_square(i)
এই মুদ্রণগুলি, পছন্দসই হিসাবে (এবং একটি যুক্তিসঙ্গত সময়েও ;-):
152415789666209426002111556165263283035677489 True
152415789666209426002111556165263283035677490 False
এটা না - প্লিজ, আগে আপনি ফ্লোটিং পয়েন্ট অন্তর্বর্তী ফলাফলের ভিত্তিতে সমাধান উপস্থাপিত, নিশ্চিত করুন তারা এই সহজ উদাহরণ সঠিকভাবে কাজ করতে পারে, শুধু একটি সময় লাগে হার্ড (আপনি শুধু কিছু অতিরিক্ত চেক ক্ষেত্রে বর্গমূল নির্ণিত একটু বন্ধ আছে প্রয়োজন), যত্ন কিছুটা।
এবং তারপরে চেষ্টা করুন x**7
এবং যে সমস্যাটি পাবেন তার চারপাশে কাজ করার চতুর উপায়টি আবিষ্কার করুন ,
OverflowError: long int too large to convert to float
অবশ্যই সংখ্যা বাড়ার সাথে সাথে আপনাকে আরও বেশি চালাক হতে হবে।
যদি আমি ছিল তাড়ার মধ্যে, অবশ্যই, আমি ব্যবহার করতাম gmpy - কিন্তু তারপর, আমি পরিষ্কারভাবে পক্ষপাতমূলক করছি ;-)।
>>> import gmpy
>>> gmpy.is_square(x**7)
1
>>> gmpy.is_square(x**7 + 1)
0
হ্যাঁ, আমি জানি, এটি এত সহজেই প্রতারণার মতো অনুভূত হয় (সাধারণভাবে পাইথনের প্রতি আমি যেভাবে অনুভব করি ;-) - কোনও চালাকি নেই, কেবল নিখুঁত প্রত্যক্ষতা এবং সরলতা (এবং, গিম্পির ক্ষেত্রে নিছক গতির ক্ষেত্রে) ; -) ...
set([x])
={x}
set
ওভিল না ? ব্যাবিলনীয় কি কেবল সেখানে রূপান্তর করে না int(sqrt(x))
, যেখানে আমাদের কেবল যাচাই করতে হবে কিনা prev != next
?
নিকটতম পূর্ণসংখ্যার স্কোয়ার রুটে দ্রুত শূন্য করতে নিউটনের পদ্ধতিটি ব্যবহার করুন, তারপরে এটি বর্গক্ষেত্র করুন এবং দেখুন এটি আপনার নম্বর কিনা। ইস্ক্রিট দেখুন ।
পাইথন ≥ 3.8 রয়েছে math.isqrt
। পাইথনের পুরানো সংস্করণটি ব্যবহার করা হলে এখানে " def isqrt(n)
" বাস্তবায়ন সন্ধান করুন ।
import math
def is_square(i: int) -> bool:
return i == math.isqrt(i) ** 2
যেহেতু আপনি ভাসমান পয়েন্ট গণনাগুলি (যেমন বর্গমূল নির্ধারণের এই পদ্ধতিগুলি) নিয়ে কাজ করার সময় কখনই সঠিক তুলনার উপর নির্ভর করতে পারবেন না, তাই ত্রুটি-প্রবণ প্রয়োগটি কম হবে
import math
def is_square(integer):
root = math.sqrt(integer)
return integer == int(root + 0.5) ** 2
কল্পনা integer
হয় 9
। math.sqrt(9)
হতে পারে 3.0
, তবে এটির মতো 2.99999
বা কিছু হতে পারে 3.00001
, সুতরাং ফলাফলটি সরাসরি বন্ধ করা নির্ভরযোগ্য নয়। মেঝেটির int
মান গ্রহণ করে তা জানা , 0.5
প্রথমবারের মাধ্যমে ভাসমানের মান বৃদ্ধি করা আমরা যে মানটিটি খুঁজছি তা আমরা পেয়ে যাব যেখানে আমরা এমন একটি সীমার মধ্যে float
রয়েছি যেখানে এখনও আমরা যার সন্ধান করছি তার নিকটবর্তী সংখ্যার প্রতিনিধিত্ব করার জন্য যথেষ্ট পরিমাণে উপযুক্ত রেজোলিউশন রয়েছে ।
if int(root + 0.5) ** 2 == integer:
করলে এটি করা কিছুটা ভাল হবে । int
floor
math.sqrt(9)
আসলে কি কখনও হতে পারে 2.99999
? সিটির কাছে পাইথনের float
মানচিত্র double
, তবে আমি মনে করি এমনকি একটি 16-বিট এফপি টাইপও এর চেয়ে আরও স্পষ্টতা রয়েছে, সুতরাং আপনার যদি এমন একটি সি সংকলক থাকে যা 8-বিট এফপি ("মিনিফ্লোয়েটস") double
টাইপ হিসাবে ব্যবহার করে ? আমি মনে করি এটি প্রযুক্তিগতভাবে সম্ভব, তবে আজ পাইথন যে কোনও কম্পিউটারে চলছে এমন ঘটনাটি আমার কাছে অসম্ভব বলে মনে হয়।
math.sqrt(9)
ফিরে আসবে তা ভাবতে পারি না 2.99999
, তবে আসল ফলাফলটি সিস্টেম-নির্ভর এবং সঠিক হওয়ার আশা করা যায় না।
আপনি যদি আগ্রহী হন তবে আমার কাছে গণিত স্ট্যাকেক্সচেঞ্জে অনুরূপ প্রশ্নের একটি খাঁটি গণিতের প্রতিক্রিয়া রয়েছে , "স্কোয়ার রুট উত্তোলনের চেয়ে দ্রুত নিখুঁত স্কোয়ারগুলি সনাক্ত করা" ।
আমার নিজের ইস্কয়ার (এন) প্রয়োগ করা সেরা নাও হতে পারে তবে আমি এটি পছন্দ করি। এই পদ্ধতির সাথে সত্যই ক্লিক করতে আমাকে গণিত তত্ত্ব, ডিজিটাল গণনা এবং পাইথন প্রোগ্রামিংয়ে নিজেকে অন্যান্য অবদানকারীদের সাথে তুলনা করে, ইত্যাদি বিষয়ে বেশ কয়েক মাস অধ্যয়ন করেছেন। যদিও আমি এর সরলতা এবং দক্ষতা পছন্দ করি। আমি আরও ভাল দেখতে না। আমাকে বল তুমি কি ভাবছ.
def isSquare(n):
## Trivial checks
if type(n) != int: ## integer
return False
if n < 0: ## positivity
return False
if n == 0: ## 0 pass
return True
## Reduction by powers of 4 with bit-logic
while n&3 == 0:
n=n>>2
## Simple bit-logic test. All perfect squares, in binary,
## end in 001, when powers of 4 are factored out.
if n&7 != 1:
return False
if n==1:
return True ## is power of 4, or even power of 2
## Simple modulo equivalency test
c = n%10
if c in {3, 7}:
return False ## Not 1,4,5,6,9 in mod 10
if n % 7 in {3, 5, 6}:
return False ## Not 1,2,4 mod 7
if n % 9 in {2,3,5,6,8}:
return False
if n % 13 in {2,5,6,7,8,11}:
return False
## Other patterns
if c == 5: ## if it ends in a 5
if (n//10)%10 != 2:
return False ## then it must end in 25
if (n//100)%10 not in {0,2,6}:
return False ## and in 025, 225, or 625
if (n//100)%10 == 6:
if (n//1000)%10 not in {0,5}:
return False ## that is, 0625 or 5625
else:
if (n//10)%4 != 0:
return False ## (4k)*10 + (1,9)
## Babylonian Algorithm. Finding the integer square root.
## Root extraction.
s = (len(str(n))-1) // 2
x = (10**s) * 4
A = {x, n}
while x * x != n:
x = (x + (n // x)) >> 1
if x in A:
return False
A.add(x)
return True
অনেকটাই অকপট. প্রথমে এটি পরীক্ষা করে দেখায় যে আমাদের একটি পূর্ণসংখ্যা রয়েছে এবং এটিতে ইতিবাচক একটি রয়েছে। নাহলে কোনও লাভ নেই। এটি 0 কে সত্য হিসাবে স্লিপ করতে দেয় (প্রয়োজনীয় অন্য কোনও ব্লক অসীম লুপ)।
কোডের পরবর্তী ব্লকটি বিট শিফট এবং বিট লজিক অপারেশনগুলি ব্যবহার করে একটি খুব দ্রুত সাব-অ্যালগরিদমে 4 টির ক্ষমতা বিন্যস্তভাবে মুছে ফেলে। আমরা শেষ পর্যন্ত আমাদের আসল n এর ইস্কয়ারটি খুঁজে পাচ্ছি না তবে এমন একটি কে <এন যা সম্ভব হলে 4 এর ক্ষমতার দ্বারা কমিয়ে দেওয়া হয়েছে। এটি আমরা যে সংখ্যার সাথে কাজ করছি তার আকার হ্রাস করে এবং ব্যাবিলনীয় পদ্ধতিটিকে সত্যিই গতি দেয়, তবে অন্যান্য চেকগুলিও দ্রুত করে তোলে।
কোডের তৃতীয় ব্লক একটি সাধারণ বুলিয়ান বিট-লজিক পরীক্ষা করে। কোনও নিখুঁত বর্গক্ষেত্রের বাইনারিতে সর্বনিম্ন উল্লেখযোগ্য তিনটি সংখ্যা 001। সর্বদা। যাইহোক যাইহোক, 4 এর পাওয়ার থেকে প্রাপ্ত নেতৃস্থানীয় শূন্যগুলির জন্য সংরক্ষণ করুন which যদি এটি পরীক্ষায় ব্যর্থ হয়, আপনি অবিলম্বে জানবেন যে এটি কোনও বর্গ নয়। যদি এটি পাস হয় তবে আপনি নিশ্চিত নন।
এছাড়াও, যদি আমরা পরীক্ষার মানটির জন্য 1 দিয়ে শেষ করি তবে পরীক্ষার সংখ্যাটি মূলত 4 এর একটি শক্তি ছিল, সম্ভবত নিজের 1 টিও।
তৃতীয় ব্লকের মতো, চতুর্থটি সাধারণ মডুলাস অপারেটরটি ব্যবহার করে দশমিকের মধ্যে স্থানটির মানটি পরীক্ষা করে এবং পূর্ববর্তী পরীক্ষার মাধ্যমে পিছলে যাওয়া মানগুলি ধরে রাখে। এছাড়াও একটি মোড 7, Mod 8, Mod 9, এবং আধুনিক 13 পরীক্ষা।
কোডের পঞ্চম ব্লকটি কয়েকটি সুপরিচিত নিখুঁত বর্গক্ষেত্রের নিদর্শনগুলির জন্য পরীক্ষা করে। 1 বা 9 এ শেষ হওয়া সংখ্যার আগে চারটির একাধিক এবং 5 এ শেষ হওয়া সংখ্যাগুলি অবশ্যই 5625, 0625, 225 বা 025 এর মধ্যে শেষ হওয়া উচিত I আমি অন্যদের অন্তর্ভুক্ত করেছিলাম তবে বুঝতে পেরেছিলাম এগুলি নিরর্থক বা আসলে কখনও ব্যবহৃত হয়নি।
শেষ অবধি, কোডের ষষ্ঠ ব্লকের সাথে সাদৃশ্যপূর্ণ শীর্ষ উত্তরদাতা - অ্যালেক্স মার্তেলি - উত্তরটি কী। মূলত প্রাচীন ব্যাবিলনীয় অ্যালগরিদম ব্যবহার করে বর্গমূল পাওয়া যায় তবে ভাসমান বিন্দুটি উপেক্ষা করার সময় এটি পূর্ণসংখ্যার মানগুলিতে সীমাবদ্ধ করে। গতির জন্য এবং টেস্টেবলের মানগুলির দৈর্ঘ্য বাড়ানোর জন্য উভয়ই সম্পন্ন করে। আমি তালিকার পরিবর্তে সেটগুলি ব্যবহার করেছি কারণ এটির তুলনায় অনেক কম সময় লাগে, আমি দুটি দ্বারা বিভাজনের পরিবর্তে বিট শিফট ব্যবহার করেছি এবং আমি স্মার্টভাবে প্রাথমিকভাবে শুরু করার মানটি আরও দক্ষতার সাথে বেছে নিয়েছি।
যাইহোক, আমি অ্যালেক্স মার্তেলির প্রস্তাবিত পরীক্ষার নম্বরটি পরীক্ষা করেছি, পাশাপাশি কয়েকটি সংখ্যা অনেকগুলি অর্ডারের আকার আরও বৃহত্তর যেমন:
x=1000199838770766116385386300483414671297203029840113913153824086810909168246772838680374612768821282446322068401699727842499994541063844393713189701844134801239504543830737724442006577672181059194558045164589783791764790043104263404683317158624270845302200548606715007310112016456397357027095564872551184907513312382763025454118825703090010401842892088063527451562032322039937924274426211671442740679624285180817682659081248396873230975882215128049713559849427311798959652681930663843994067353808298002406164092996533923220683447265882968239141724624870704231013642255563984374257471112743917655991279898690480703935007493906644744151022265929975993911186879561257100479593516979735117799410600147341193819147290056586421994333004992422258618475766549646258761885662783430625 ** 2
for i in range(x, x+2):
print(i, isSquare(i))
নিম্নলিখিত ফলাফল মুদ্রিত:
1000399717477066534083185452789672211951514938424998708930175541558932213310056978758103599452364409903384901149641614494249195605016959576235097480592396214296565598519295693079257885246632306201885850365687426564365813280963724310434494316592041592681626416195491751015907716210235352495422858432792668507052756279908951163972960239286719854867504108121432187033786444937064356645218196398775923710931242852937602515835035177768967470757847368349565128635934683294155947532322786360581473152034468071184081729335560769488880138928479829695277968766082973795720937033019047838250608170693879209655321034310764422462828792636246742456408134706264621790736361118589122797268261542115823201538743148116654378511916000714911467547209475246784887830649309238110794938892491396597873160778553131774466638923135932135417900066903068192088883207721545109720968467560224268563643820599665232314256575428214983451466488658896488012211237139254674708538347237589290497713613898546363590044902791724541048198769085430459186735166233549186115282574626012296888817453914112423361525305960060329430234696000121420787598967383958525670258016851764034555105019265380321048686563527396844220047826436035333266263375049097675787975100014823583097518824871586828195368306649956481108708929669583308777347960115138098217676704862934389659753628861667169905594181756523762369645897154232744410732552956489694024357481100742138381514396851789639339362228442689184910464071202445106084939268067445115601375050153663645294106475257440167535462278022649865332161044187890625 True
1000399717477066534083185452789672211951514938424998708930175541558932213310056978758103599452364409903384901149641614494249195605016959576235097480592396214296565598519295693079257885246632306201885850365687426564365813280963724310434494316592041592681626416195491751015907716210235352495422858432792668507052756279908951163972960239286719854867504108121432187033786444937064356645218196398775923710931242852937602515835035177768967470757847368349565128635934683294155947532322786360581473152034468071184081729335560769488880138928479829695277968766082973795720937033019047838250608170693879209655321034310764422462828792636246742456408134706264621790736361118589122797268261542115823201538743148116654378511916000714911467547209475246784887830649309238110794938892491396597873160778553131774466638923135932135417900066903068192088883207721545109720968467560224268563643820599665232314256575428214983451466488658896488012211237139254674708538347237589290497713613898546363590044902791724541048198769085430459186735166233549186115282574626012296888817453914112423361525305960060329430234696000121420787598967383958525670258016851764034555105019265380321048686563527396844220047826436035333266263375049097675787975100014823583097518824871586828195368306649956481108708929669583308777347960115138098217676704862934389659753628861667169905594181756523762369645897154232744410732552956489694024357481100742138381514396851789639339362228442689184910464071202445106084939268067445115601375050153663645294106475257440167535462278022649865332161044187890626 False
এবং এটি 0.33 সেকেন্ডে এটি করেছে।
আমার মতে, আমার অ্যালগরিদম তার সমস্ত সুবিধাগুলি সহ অ্যালেক্স মার্তেলির মতোই কাজ করে, তবে এতে অতিরিক্ত সুবিধা রয়েছে অত্যন্ত কার্যকর সহজ-পরীক্ষা প্রত্যাখ্যান যা অনেক সময় সাশ্রয় করে, ক্ষমতা দ্বারা পরীক্ষার সংখ্যার আকার হ্রাসের কথা উল্লেখ না করে 4, যা গতি, দক্ষতা, নির্ভুলতা এবং পরীক্ষার যোগ্য সংখ্যার আকারকে উন্নত করে। পাইথন-না-বাস্তবায়নের ক্ষেত্রে সম্ভবত বিশেষভাবে সত্য।
ব্যাবিলনীয় রুট নিষ্কাশন এমনকি বাস্তবায়নের আগে প্রায় 99% সমস্ত পূর্ণসংখ্যাকে স্কোয়ার হিসাবে অকার্যকর হিসাবে প্রত্যাখ্যান করা হয় এবং 2/3 এর মধ্যে ব্যাবিলনীয় পূর্ণসংখ্যা প্রত্যাখ্যান করতে লাগে। এবং যদিও এই পরীক্ষাগুলি সেই প্রক্রিয়াটিকে তাত্পর্যপূর্ণ করে তুলবে না, তবে সমস্ত পরীক্ষার সংখ্যাকে হ্রাস করার ফলে 4 টির সমস্ত ক্ষমতা ভাগ করে সত্যই ব্যাবিলনীয় পরীক্ষাকে ত্বরান্বিত করে।
আমি একটি সময়ের তুলনা পরীক্ষা করেছি। আমি পর পর 1 থেকে 10 মিলিয়ন পর্যন্ত সমস্ত পূর্ণসংখ্যার পরীক্ষা করেছি। কেবলমাত্র ব্যাবিলনীয় পদ্ধতিটি নিজেই ব্যবহার করে (আমার বিশেষভাবে উপযুক্ত প্রাথমিক অনুমানের সাথে) এটি আমার সারফেস 3 গড়ে ১5৫ সেকেন্ড (100% নির্ভুলতার সাথে) নিয়েছে। আমার অ্যালগরিদমে কেবলমাত্র লজিক্যাল পরীক্ষাগুলি ব্যবহার করে (ব্যাবিলনীয় বাদে) এটি 127 সেকেন্ড সময় নিয়েছে, এটি ভুলভাবে কোনও নিখুঁত স্কোয়্যার প্রত্যাখ্যান না করে 99% সমস্ত স্কোরকে নন-স্কোয়ার হিসাবে প্রত্যাখ্যান করেছে। পাস হওয়া সংখ্যার মধ্যে কেবল 3% ছিল নিখুঁত স্কোয়ার (অনেক বেশি ঘনত্ব)। লজিকাল টেস্ট এবং ব্যাবিলনীয় রুট নিষ্কাশন উভয়কেই নিয়োগ করে উপরের সম্পূর্ণ অ্যালগরিদম ব্যবহার করে, আমাদের 100% নির্ভুলতা রয়েছে এবং মাত্র 14 সেকেন্ডের মধ্যে পরীক্ষার সমাপ্তি ঘটে। প্রথম 100 মিলিয়ন পূর্ণসংখ্যার পরীক্ষা করতে 2 মিনিট 45 সেকেন্ড সময় লাগে।
সম্পাদনা: আমি সময়কে আরও কমিয়ে আনতে সক্ষম হয়েছি। আমি এখন 1 মিনিট 40 সেকেন্ডে 0 থেকে 100 মিলিয়ন পূর্ণসংখ্যা পরীক্ষা করতে পারি। ডেটা টাইপ এবং ইতিবাচকতা পরীক্ষা করে প্রচুর সময় নষ্ট হয়। প্রথম দুটি চেক মুছে ফেলুন এবং আমি এক মিনিটের মধ্যে পরীক্ষার কেটে ফেললাম। একজনকে অবশ্যই ধরে নিতে হবে যে ব্যবহারকারী তা জানতে যথেষ্ট স্মার্ট যে sণাত্মক এবং ভাসমানগুলি নিখুঁত বর্গ নয়।
import math
def is_square(n):
sqrt = math.sqrt(n)
return (sqrt - int(sqrt)) == 0
একটি নিখুঁত বর্গ এমন একটি সংখ্যা যা দুটি সমান পূর্ণসংখ্যার পণ্য হিসাবে প্রকাশ করা যেতে পারে। math.sqrt(number)
ফিরে a float
। int(math.sqrt(number))
ফলাফল কাস্টint
।
বর্গমূলটি যদি 3 এর মতো একটি পূর্ণসংখ্যা হয়, উদাহরণস্বরূপ, তবে math.sqrt(number) - int(math.sqrt(number))
0 হবে এবং if
বিবৃতিটি হবে False
। বর্গমূলটি যদি 3.2 এর মতো আসল সংখ্যা হত তবে তা হবেTrue
এবং "এটি একটি নিখুঁত বর্গ নয়" মুদ্রণ ।
এটি 152415789666209426002111556165263283035677490 এর মতো বৃহত স্কোয়ারে ব্যর্থ হয় ।
if (math.sqrt(number)-int(math.sqrt(number))):
করার জন্য a=math.sqrt(number)
তারপর আরেকটি লাইন: if a-int(a):
। এটি কেবলমাত্র একবার স্কোয়ার রুট গণনা করতে হবে, যা বড় এন এর জন্য
আমার উত্তর:
def is_square(x):
return x**.5 % 1 == 0
এটি মূলত একটি বর্গক্ষেত্রের কাজ করে, তারপরে পূর্ণসংখ্যার অংশটি ছাঁটাতে 1 দ্বারা মডিউল করে এবং ফলাফল যদি 0 হয় তবে True
অন্যথায় ফিরে আসুন False
। এক্ষেত্রে এক্স যে কোনও বৃহৎ সংখ্যা হতে পারে, পাইথন হ্যান্ডেল করতে পারে এমন সর্বাধিক ফ্লোট সংখ্যার চেয়ে বড় নয়: 1.7976931348623157e + 308
এটি একটি বৃহত স্কোয়ার যেমন 152415789666209426002111556165263283035677490 হিসাবে ভুল।
স্বেচ্ছাসেবী যথাযথভাবে স্কোয়ার শিকড় এবং "নির্ভুলতার জন্য" সহজ চেক পেতে মডিউলটি ব্যবহার করে এটিdecimal
সমাধান করা যেতে পারে :
import math
from decimal import localcontext, Context, Inexact
def is_perfect_square(x):
# If you want to allow negative squares, then set x = abs(x) instead
if x < 0:
return False
# Create localized, default context so flags and traps unset
with localcontext(Context()) as ctx:
# Set a precision sufficient to represent x exactly; `x or 1` avoids
# math domain error for log10 when x is 0
ctx.prec = math.ceil(math.log10(x or 1)) + 1 # Wrap ceil call in int() on Py2
# Compute integer square root; don't even store result, just setting flags
ctx.sqrt(x).to_integral_exact()
# If previous line couldn't represent square root as exact int, sets Inexact flag
return not ctx.flags[Inexact]
সত্যিকারের বিশাল মান সহকারে বিক্ষোভের জন্য:
# I just kept mashing the numpad for awhile :-)
>>> base = 100009991439393999999393939398348438492389402490289028439083249803434098349083490340934903498034098390834980349083490384903843908309390282930823940230932490340983098349032098324908324098339779438974879480379380439748093874970843479280329708324970832497804329783429874329873429870234987234978034297804329782349783249873249870234987034298703249780349783497832497823497823497803429780324
>>> sqr = base ** 2
>>> sqr ** 0.5 # Too large to use floating point math
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: int too large to convert to float
>>> is_perfect_power(sqr)
True
>>> is_perfect_power(sqr-1)
False
>>> is_perfect_power(sqr+1)
False
যদি আপনি পরীক্ষিত মানটির আকার বাড়িয়ে তোলেন তবে শেষ পর্যন্ত এটি ধীরে ধীরে ধীরে ধীরে বেড়ে যায় (200,000 বিট বর্গক্ষেত্রের জন্য এক সেকেন্ডের কাছাকাছি সময় নেয়), তবে আরও পরিমিত সংখ্যার জন্য (বলুন, 20,000 বিট), এটি এখনও মানুষের চেয়ে লক্ষ্য রাখার চেয়ে দ্রুত স্বতন্ত্র মান (আমার মেশিনে 33 ডলার) তবে যেহেতু গতি আপনার প্রাথমিক উদ্বেগ ছিল না তাই পাইথনের মানক পাঠাগারগুলি দিয়ে এটি করার একটি ভাল উপায়।
অবশ্যই এটি ব্যবহার করা gmpy2
এবং কেবল পরীক্ষা করা আরও দ্রুত হবে gmpy2.mpz(x).is_square()
তবে তৃতীয় পক্ষের প্যাকেজগুলি যদি আপনার জিনিস না হয় তবে উপরেরটি বেশ কার্যকরভাবে কাজ করে।
আমি কেবলমাত্র অন্য থ্রেডের উপরের কয়েকটি উদাহরণের ( সামান্য স্কোয়ার সন্ধান করা ) সামান্যতম প্রকরণ পোস্ট করেছি এবং ভেবেছিলাম যে আমি এখানে যা পোস্ট করেছি তার একটি সামান্য প্রকরণকে অন্তর্ভুক্ত করব (এনএসকিআর্টকে অস্থায়ী পরিবর্তনশীল হিসাবে ব্যবহার করে), যদি এটি আগ্রহী / ব্যবহার:
import math
def is_square(n):
if not (isinstance(n, int) and (n >= 0)):
return False
else:
nsqrt = math.sqrt(n)
return nsqrt == math.trunc(nsqrt)
এটি একটি বৃহত স্কোয়ার যেমন 152415789666209426002111556165263283035677490 হিসাবে ভুল।
এটি আমার পদ্ধতি:
def is_square(n) -> bool:
return int(n**0.5)**2 == int(n)
সংখ্যার বর্গমূল নিন। পূর্ণসংখ্যায় রূপান্তর করুন। বর্গ নিন। যদি সংখ্যাগুলি সমান হয়, তবে এটি একটি নিখুঁত বর্গ অন্যথায় নয়।
এটি একটি বৃহত স্কোয়ার যেমন 152415789666209426002111556165263283035677489 হিসাবে ভুল।
বৃত্তাকার বর্গাকারের জন্য আপনি বাইনারি-অনুসন্ধান করতে পারেন। ফলাফলটি মূল মানের সাথে মেলে কিনা তা দেখতে স্কোয়ার করুন।
আপনি সম্ভবত ফোগলবার্ডস উত্তরের সাথে আরও ভাল আছেন - তবে সাবধান থাকুন, কারণ ভাসমান পয়েন্ট গণিতটি আনুমানিক, যা এই পদ্ধতিটি বন্ধ করে দিতে পারে। আপনি নীতিগতভাবে একটি বৃহত পূর্ণসংখ্যার থেকে একটি মিথ্যা ধনাত্মক পেতে পারেন যা নিখুঁত হারের জন্য, উদাহরণস্বরূপ, নিখুঁত বর্গক্ষেত্রের চেয়ে আরও একটি।
বর্গমূলের দ্বারা বিভাজক থেকে যদি মডুলাস (বাকী) টি অবশিষ্ট থাকে তবে এটি একটি নিখুঁত বর্গ হয়।
def is_square(num: int) -> bool:
return num % math.sqrt(num) == 0
আমি এটিকে 1000 এর নিখুঁত স্কোয়ারগুলির তালিকার বিপরীতে দেখেছি।
এই প্রতিক্রিয়াটি আপনার বর্ণিত প্রশ্নের সাথে সম্পর্কিত নয়, তবে আপনার পোস্ট করা কোডটিতে আমি একটি অন্তর্নিহিত প্রশ্নের সাথে দেখতে পেয়েছি, যেমন, "কোনও কিছু সংখ্যার পূর্ণসংখ্যা কিনা তা কিভাবে পরীক্ষা করতে হবে?"
আপনি যে প্রশ্নটি সম্পর্কে সাধারণত উত্তরটি পাবেন তা হ'ল "না!" এবং এটি সত্য যে পাইথনে টাইপচেকিং করা সাধারণত সঠিক জিনিস নয়।
এই বিরল ব্যতিক্রমগুলির জন্য, যদিও সংখ্যার স্ট্রিং উপস্থাপনায় দশমিক পয়েন্ট সন্ধান করার পরিবর্তে করণীয় বিষয় হল আইসনস্ট্যান্স ফাংশনটি ব্যবহার করা :
>>> isinstance(5,int)
True
>>> isinstance(5.0,int)
False
অবশ্যই এটি মানের পরিবর্তে ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য। মানটি পূর্ণসংখ্যা কিনা তা যদি আমি নির্ধারণ করতে চাইতাম তবে আমি এটি করতাম:
>>> x=5.0
>>> round(x) == x
True
তবে অন্য সবাই যেমন বিশদটি কভার করেছেন, এই জাতীয় জিনিসগুলির বেশিরভাগ খেলনাবিহীন উদাহরণগুলিতে ভাসমান-পয়েন্ট বিষয়গুলি বিবেচনা করা উচিত।
আপনি যদি কোনও পরিসীমাটি লুপ করতে চান এবং প্রতিটি সংখ্যার জন্য এমন কিছু করতে চান যা নিখুঁত বর্গ নয়, আপনি এরকম কিছু করতে পারেন:
def non_squares(upper):
next_square = 0
diff = 1
for i in range(0, upper):
if i == next_square:
next_square += diff
diff += 2
continue
yield i
আপনি যদি প্রতিটি সংখ্যার জন্য কিছু করতে চান যা একটি নিখুঁত বর্গ, জেনারেটরটি আরও সহজ:
(n * n for n in range(upper))
আমি মনে করি এটি কার্যকর এবং খুব সহজ:
import math
def is_square(num):
sqrt = math.sqrt(num)
return sqrt == int(sqrt)
এটি একটি বৃহত স্কোয়ার যেমন 152415789666209426002111556165263283035677490 হিসাবে ভুল।
set
যখন x in seen
হয় True
:
x
এর ক্রম 511, 256, 129, 68, 41, 32, 31 , 31 উত্পাদন করে ;অতএব, পূর্বেরটির x
তুলনায় বর্তমানের পরিমাণ বৃহত্তর বা সমান হওয়ার সাথে সাথে এটি থামার পক্ষে যথেষ্ট :
def is_square(n):
assert n > 1
previous = n
x = n // 2
while x * x != n:
x = (x + (n // x)) // 2
if x >= previous:
return False
previous = x
return True
x = 12345678987654321234567 ** 2
assert not is_square(x-1)
assert is_square(x)
assert not is_square(x+1)
1 <এন <10 ** 7 এর জন্য পরীক্ষিত মূল অ্যালগরিদমের সাথে সমতা। একই ব্যবধানে, এই সামান্য সরল বৈকল্পিকটি প্রায় 1.4 গুণ বেশি দ্রুত।
a=int(input('enter any number'))
flag=0
for i in range(1,a):
if a==i*i:
print(a,'is perfect square number')
flag=1
break
if flag==1:
pass
else:
print(a,'is not perfect square number')
ধারণাটি হ'ল আমি = 1 থেকে ফ্লোর (স্কয়ার্ট (এন)) পর্যন্ত একটি লুপ চালনা করব তারপরে স্কোয়ারিং এটি এন করে কিনা তা পরীক্ষা করে দেখুন।
bool isPerfectSquare(int n)
{
for (int i = 1; i * i <= n; i++) {
// If (i * i = n)
if ((n % i == 0) && (n / i == i)) {
return true;
}
}
return false;
}
import math
def is_square(n):
sqrt = math.sqrt(n)
return sqrt == int(sqrt)
এটি 152415789666209426002111556165263283035677490 এর মতো বৃহত স্কোয়ারে ব্যর্থ হয় ।