কোনও সংখ্যাটি নিখুঁত বর্গক্ষেত্র কিনা তা পরীক্ষা করে দেখুন


85

সংখ্যাটি নিখুঁত বর্গক্ষেত্র কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?

গতি কোনও উদ্বেগের বিষয় নয়, আপাতত সবে কাজ করছে।


4
খুব সংখ্যক সংখ্যক লোকের জন্য, একটি দ্রুত এলোমেলাইজ
টমাস আহলে

উত্তর:


117

কোনও ভাসমান পয়েন্ট গণনা ( 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

হ্যাঁ, আমি জানি, এটি এত সহজেই প্রতারণার মতো অনুভূত হয় (সাধারণভাবে পাইথনের প্রতি আমি যেভাবে অনুভব করি ;-) - কোনও চালাকি নেই, কেবল নিখুঁত প্রত্যক্ষতা এবং সরলতা (এবং, গিম্পির ক্ষেত্রে নিছক গতির ক্ষেত্রে) ; -) ...


আপনি লেখক সম্পর্কে যা চান তা বলুন, জিম্পি এই কাজের জন্য দুর্দান্ত সরঞ্জাম বলে মনে হচ্ছে।
মাইক গ্রাহাম

4
ব্যাবিলনীয় পদ্ধতিটি কার্যকরভাবে কাজ করে তবে শূন্য দ্বারা বিভাগ এড়ানোর জন্য আপনার 0 এবং 1 এর জন্য বিশেষ কেস থাকা দরকার।
এমপেনকভ

4
যাইহোক, set([x])={x}
অস্কার মেডেরোস

6
setওভিল না ? ব্যাবিলনীয় কি কেবল সেখানে রূপান্তর করে না int(sqrt(x)), যেখানে আমাদের কেবল যাচাই করতে হবে কিনা prev != next?
টমাসজ গেন্ডার

4
"আমি জানি, এটি এত সহজেই প্রতারণার মতো অনুভব করে (কিছুটা সাধারণভাবে পাইথনের প্রতি আমার মনে হয়"। খুব সত্য;)
আরুলাক্স জেড

39

নিকটতম পূর্ণসংখ্যার স্কোয়ার রুটে দ্রুত শূন্য করতে নিউটনের পদ্ধতিটি ব্যবহার করুন, তারপরে এটি বর্গক্ষেত্র করুন এবং দেখুন এটি আপনার নম্বর কিনা। ইস্ক্রিট দেখুন ।

পাইথন ≥ 3.8 রয়েছে math.isqrt। পাইথনের পুরানো সংস্করণটি ব্যবহার করা হলে এখানে " def isqrt(n)" বাস্তবায়ন সন্ধান করুন

import math

def is_square(i: int) -> bool:
    return i == math.isqrt(i) ** 2

20

যেহেতু আপনি ভাসমান পয়েন্ট গণনাগুলি (যেমন বর্গমূল নির্ধারণের এই পদ্ধতিগুলি) নিয়ে কাজ করার সময় কখনই সঠিক তুলনার উপর নির্ভর করতে পারবেন না, তাই ত্রুটি-প্রবণ প্রয়োগটি কম হবে

import math

def is_square(integer):
    root = math.sqrt(integer)
    return integer == int(root + 0.5) ** 2

কল্পনা integerহয় 9math.sqrt(9)হতে পারে 3.0, তবে এটির মতো 2.99999বা কিছু হতে পারে 3.00001, সুতরাং ফলাফলটি সরাসরি বন্ধ করা নির্ভরযোগ্য নয়। মেঝেটির intমান গ্রহণ করে তা জানা , 0.5প্রথমবারের মাধ্যমে ভাসমানের মান বৃদ্ধি করা আমরা যে মানটিটি খুঁজছি তা আমরা পেয়ে যাব যেখানে আমরা এমন একটি সীমার মধ্যে floatরয়েছি যেখানে এখনও আমরা যার সন্ধান করছি তার নিকটবর্তী সংখ্যার প্রতিনিধিত্ব করার জন্য যথেষ্ট পরিমাণে উপযুক্ত রেজোলিউশন রয়েছে ।


4
আমাদের যত্ন নেওয়া সংখ্যার জন্য কাজ if int(root + 0.5) ** 2 == integer:করলে এটি করা কিছুটা ভাল হবে । intfloor
ডেভিড জনস্টোন

@ ডেভিড জনস্টোন, আমি প্রয়োগটি ব্যবহার করতে এই পোস্টটি পরিবর্তন করেছি, যা আমি স্বীকার করি আমার আগের পুরানো পদ্ধতির চেয়ে ভাল। যে কোনও ইভেন্টে, অন্য যে কৌশলগুলি এখানে উল্লেখ করেছেন সেগুলির মধ্যে কিছু আরও ভাল এবং আরও নির্ভরযোগ্য।
মাইক গ্রাহাম

আমি বুঝতে পারি যে এফপি আনুমানিক, তবে math.sqrt(9)আসলে কি কখনও হতে পারে 2.99999? সিটির কাছে পাইথনের floatমানচিত্র double, তবে আমি মনে করি এমনকি একটি 16-বিট এফপি টাইপও এর চেয়ে আরও স্পষ্টতা রয়েছে, সুতরাং আপনার যদি এমন একটি সি সংকলক থাকে যা 8-বিট এফপি ("মিনিফ্লোয়েটস") doubleটাইপ হিসাবে ব্যবহার করে ? আমি মনে করি এটি প্রযুক্তিগতভাবে সম্ভব, তবে আজ পাইথন যে কোনও কম্পিউটারে চলছে এমন ঘটনাটি আমার কাছে অসম্ভব বলে মনে হয়।
কেন

@ কেন, আমি অন্তর্নিহিত ধারণাটি পাচ্ছি তা বোঝাতে "এমন কিছু" বলেছি; এটির গ্যারান্টি নেই যে আপনি যে মূল্য পাবেন সেটি সঠিক মানের থেকে কিছুটা কম হবে না। আমি এটি কোনও নির্দিষ্ট সিস্টেমে math.sqrt(9)ফিরে আসবে তা ভাবতে পারি না 2.99999, তবে আসল ফলাফলটি সিস্টেম-নির্ভর এবং সঠিক হওয়ার আশা করা যায় না।
মাইক গ্রাহাম

4
এই ফাংশনটি 152415789666209426002111556165263283035677489 এর মতো বৃহত স্কোয়ারের জন্য ভুল
একিউম্যানাস

13

আপনি যদি আগ্রহী হন তবে আমার কাছে গণিত স্ট্যাকেক্সচেঞ্জে অনুরূপ প্রশ্নের একটি খাঁটি গণিতের প্রতিক্রিয়া রয়েছে , "স্কোয়ার রুট উত্তোলনের চেয়ে দ্রুত নিখুঁত স্কোয়ারগুলি সনাক্ত করা"

আমার নিজের ইস্কয়ার (এন) প্রয়োগ করা সেরা নাও হতে পারে তবে আমি এটি পছন্দ করি। এই পদ্ধতির সাথে সত্যই ক্লিক করতে আমাকে গণিত তত্ত্ব, ডিজিটাল গণনা এবং পাইথন প্রোগ্রামিংয়ে নিজেকে অন্যান্য অবদানকারীদের সাথে তুলনা করে, ইত্যাদি বিষয়ে বেশ কয়েক মাস অধ্যয়ন করেছেন। যদিও আমি এর সরলতা এবং দক্ষতা পছন্দ করি। আমি আরও ভাল দেখতে না। আমাকে বল তুমি কি ভাবছ.

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ণাত্মক এবং ভাসমানগুলি নিখুঁত বর্গ নয়।


সরলতার পক্ষে, গৃহীত উত্তরটি বীট করা শক্ত। পারফরম্যান্স-ভিত্তিক, আপনার আরও ভাল হওয়া উচিত। আমি ছোট প্রাইমগুলির বর্গক্ষেত্রের দ্বারা লক্ষ্য হ্রাস করার মান নিয়ে সংশয়ী, তবে ছোট প্রাইমগুলির জন্য জ্যাকোবি প্রতীকগুলির কম্পিউটিং একটি জয় হওয়া উচিত। এবং বৃহত্তর সংখ্যাগুলি এই উত্তরটির জন্য আরও বড় সুবিধা।
রাষ্ট্রপতি জেমস কে পোলক

4
জ্যাকোবি প্রতীক গণনার জন্য ডিটারমিনিস্টিক ফলাফল প্রদানের জন্য ক্ষুদ্র প্রাইমগুলির ক্ষমতা দ্বারা হ্রাস প্রয়োজনীয় necessary অন্যথায় এটি সর্বোত্তম সম্ভাবনাময়, বা অ-স্কোয়ারনেসের জন্য নির্ধারক, তবে স্কোয়ারনেসটি যাচাই করে না। আমি আংশিকভাবে কেন স্কোয়ারের শক্তি দ্বারা ফ্যাক্টরিং করি; আমি যে একমাত্র জ্যাকোবি প্রতীকগুলি গণনা করি তা হ'ল আমি যে ছোট ছোট প্রাইমগুলি তৈরি করি তার জন্য। ব্যাবিলনীয় পদ্ধতিটি পরে আরও দ্রুত ব্যবহার করতে টেস্ট নম্বরটির আকার হ্রাস করার জন্য আমি এটিও করি (তবে এটি বিতর্কযোগ্য)।
কোজিটোআর্গো কোজিটোসাম

ঠিক আছে, এটি অবশ্যই একটি ভাল এবং অনন্য উত্তর এবং ভবিষ্যতে আমার কিছুটা সময় এটি নিয়ে খেলতে চাইলে নির্দিষ্ট প্রাইমসের সংখ্যার পরিবর্তনের জন্য কিছু সময় চেষ্টা করে দেখুন কোনও প্রদত্ত বিটসাইজে একটি সর্বোত্তম নম্বর পাওয়া যাবে কিনা ।
রাষ্ট্রপতি জেমস কে। পোলক

4
যাইহোক, আমার কোড পরীক্ষা করুন। ভেঙ্গে ফেল. আমি ব্যবসায়ের দ্বারা প্রোগ্রামার নই, আমি গণিতের মেজর। পাইথন কেবল একটি শখ। আইডিটি যদি আগ্রহী হয় তবে এটি যদি গড়ে আরও দক্ষ হয়।
কোজিটোআর্গো কোজিটোসাম

4
আপনি যদি এখনও আগ্রহী হন তবে এখানে কিছু আকর্ষণীয় উত্তর, বিশেষত এআরেক্সের উত্তর সহ মূলত একটি সদৃশ প্রশ্ন রয়েছে ।
রাষ্ট্রপতি জেমস কে পোলক

12
import math

def is_square(n):
    sqrt = math.sqrt(n)
    return (sqrt - int(sqrt)) == 0

একটি নিখুঁত বর্গ এমন একটি সংখ্যা যা দুটি সমান পূর্ণসংখ্যার পণ্য হিসাবে প্রকাশ করা যেতে পারে। math.sqrt(number)ফিরে a floatint(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):। এটি কেবলমাত্র একবার স্কোয়ার রুট গণনা করতে হবে, যা বড় এন এর জন্য
ইমোটি

পছন্দ করুন
ব্যবহারকারী 1717828

আমি বেশ নিশ্চিত যে স্কয়ারটি - ইন (স্কয়ার্ট) স্কয়ারটি% 1 এর সাথে সমান। আপনার সম্পূর্ণ ফাংশনটি সবেমাত্র গণিত.স.কিউটার্ট (এন)% 1 == 0 হতে পারে
কোজিটোআর্গো কোজিটোসাম

6

আমার উত্তর:

def is_square(x):
    return x**.5 % 1 == 0

এটি মূলত একটি বর্গক্ষেত্রের কাজ করে, তারপরে পূর্ণসংখ্যার অংশটি ছাঁটাতে 1 দ্বারা মডিউল করে এবং ফলাফল যদি 0 হয় তবে Trueঅন্যথায় ফিরে আসুন False। এক্ষেত্রে এক্স যে কোনও বৃহৎ সংখ্যা হতে পারে, পাইথন হ্যান্ডেল করতে পারে এমন সর্বাধিক ফ্লোট সংখ্যার চেয়ে বড় নয়: 1.7976931348623157e + 308

এটি একটি বৃহত স্কোয়ার যেমন 152415789666209426002111556165263283035677490 হিসাবে ভুল।


5

স্বেচ্ছাসেবী যথাযথভাবে স্কোয়ার শিকড় এবং "নির্ভুলতার জন্য" সহজ চেক পেতে মডিউলটি ব্যবহার করে এটি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()তবে তৃতীয় পক্ষের প্যাকেজগুলি যদি আপনার জিনিস না হয় তবে উপরেরটি বেশ কার্যকরভাবে কাজ করে।


5

আমি কেবলমাত্র অন্য থ্রেডের উপরের কয়েকটি উদাহরণের ( সামান্য স্কোয়ার সন্ধান করা ) সামান্যতম প্রকরণ পোস্ট করেছি এবং ভেবেছিলাম যে আমি এখানে যা পোস্ট করেছি তার একটি সামান্য প্রকরণকে অন্তর্ভুক্ত করব (এনএসকিআর্টকে অস্থায়ী পরিবর্তনশীল হিসাবে ব্যবহার করে), যদি এটি আগ্রহী / ব্যবহার:

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 হিসাবে ভুল।


2

এটি আমার পদ্ধতি:

def is_square(n) -> bool:
    return int(n**0.5)**2 == int(n)

সংখ্যার বর্গমূল নিন। পূর্ণসংখ্যায় রূপান্তর করুন। বর্গ নিন। যদি সংখ্যাগুলি সমান হয়, তবে এটি একটি নিখুঁত বর্গ অন্যথায় নয়।

এটি একটি বৃহত স্কোয়ার যেমন 152415789666209426002111556165263283035677489 হিসাবে ভুল।


নেতিবাচক সংখ্যার জন্য কাজ করবে না তবুও দুর্দান্ত সমাধান!
রিক এম।

1

বৃত্তাকার বর্গাকারের জন্য আপনি বাইনারি-অনুসন্ধান করতে পারেন। ফলাফলটি মূল মানের সাথে মেলে কিনা তা দেখতে স্কোয়ার করুন।

আপনি সম্ভবত ফোগলবার্ডস উত্তরের সাথে আরও ভাল আছেন - তবে সাবধান থাকুন, কারণ ভাসমান পয়েন্ট গণিতটি আনুমানিক, যা এই পদ্ধতিটি বন্ধ করে দিতে পারে। আপনি নীতিগতভাবে একটি বৃহত পূর্ণসংখ্যার থেকে একটি মিথ্যা ধনাত্মক পেতে পারেন যা নিখুঁত হারের জন্য, উদাহরণস্বরূপ, নিখুঁত বর্গক্ষেত্রের চেয়ে আরও একটি।


1

বর্গমূলের দ্বারা বিভাজক থেকে যদি মডুলাস (বাকী) টি অবশিষ্ট থাকে তবে এটি একটি নিখুঁত বর্গ হয়।

def is_square(num: int) -> bool:
    return num % math.sqrt(num) == 0

আমি এটিকে 1000 এর নিখুঁত স্কোয়ারগুলির তালিকার বিপরীতে দেখেছি।


0
  1. সংখ্যাটি কত দিন স্থির করবেন।
  2. একটি ব-দ্বীপ নিন 0.00000000000000 ....... 000001
  3. দেখুন (স্কয়ার্ট (এক্স)) ^ 2 - এক্স বদ্বীপের চেয়ে বৃহত্তর / সমান / ছোট এবং ব-দ্বীপের ত্রুটির ভিত্তিতে সিদ্ধান্ত নিন।

0

এই প্রতিক্রিয়াটি আপনার বর্ণিত প্রশ্নের সাথে সম্পর্কিত নয়, তবে আপনার পোস্ট করা কোডটিতে আমি একটি অন্তর্নিহিত প্রশ্নের সাথে দেখতে পেয়েছি, যেমন, "কোনও কিছু সংখ্যার পূর্ণসংখ্যা কিনা তা কিভাবে পরীক্ষা করতে হবে?"

আপনি যে প্রশ্নটি সম্পর্কে সাধারণত উত্তরটি পাবেন তা হ'ল "না!" এবং এটি সত্য যে পাইথনে টাইপচেকিং করা সাধারণত সঠিক জিনিস নয়।

এই বিরল ব্যতিক্রমগুলির জন্য, যদিও সংখ্যার স্ট্রিং উপস্থাপনায় দশমিক পয়েন্ট সন্ধান করার পরিবর্তে করণীয় বিষয় হল আইসনস্ট্যান্স ফাংশনটি ব্যবহার করা :

>>> isinstance(5,int)
True
>>> isinstance(5.0,int)
False

অবশ্যই এটি মানের পরিবর্তে ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য। মানটি পূর্ণসংখ্যা কিনা তা যদি আমি নির্ধারণ করতে চাইতাম তবে আমি এটি করতাম:

>>> x=5.0
>>> round(x) == x
True

তবে অন্য সবাই যেমন বিশদটি কভার করেছেন, এই জাতীয় জিনিসগুলির বেশিরভাগ খেলনাবিহীন উদাহরণগুলিতে ভাসমান-পয়েন্ট বিষয়গুলি বিবেচনা করা উচিত।


4
"এটি একটি মানের পরিবর্তে চলকটিতে প্রযোজ্য" এর অর্থ কী? আপনি গোল (5.0) == 5.0 এবং সমস্যা ছাড়াই (x, int) ব্যবহার করতে পারেন। (এবং OOWTDI কেবল x.is_integer () কল করতে হবে))
ভিকি

0

আপনি যদি কোনও পরিসীমাটি লুপ করতে চান এবং প্রতিটি সংখ্যার জন্য এমন কিছু করতে চান যা নিখুঁত বর্গ নয়, আপনি এরকম কিছু করতে পারেন:

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))

0

আমি মনে করি এটি কার্যকর এবং খুব সহজ:

import math

def is_square(num):
    sqrt = math.sqrt(num)
    return sqrt == int(sqrt)

এটি একটি বৃহত স্কোয়ার যেমন 152415789666209426002111556165263283035677490 হিসাবে ভুল।


এটি উপরের উত্তরের মতোই।
একরাম দিনুল

0

@ অ্যালেক্স মার্তেলির সমাধান ছাড়াই একটি রূপ set

যখন x in seenহয় True:

  • বেশিরভাগ ক্ষেত্রে এটি সর্বশেষ যুক্ত হয়, যেমন 1022 xএর ক্রম 511, 256, 129, 68, 41, 32, 31 , 31 উত্পাদন করে ;
  • কিছু ক্ষেত্রে (যেমন নিখুঁত স্কোয়ারের পূর্বসূরীদের জন্য) এটি দ্বিতীয় থেকে শেষের হিসাবে যুক্ত হয়, যেমন 1023 511, 256, 129, 68, 41, 32 , 31, 32 উত্পাদন করে

অতএব, পূর্বেরটির 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 গুণ বেশি দ্রুত।


0
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')

এই কোড সমস্যা সমাধানের পারে যদিও, একটি ভাল উত্তর এছাড়াও ব্যাখ্যা করতে হবে কি কোড করে এবং কিভাবে এটা সাহায্য করে।
বিডিএল

0

ধারণাটি হ'ল আমি = 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; 
} 

-2
import math

def is_square(n):
    sqrt = math.sqrt(n)
    return sqrt == int(sqrt)

এটি 152415789666209426002111556165263283035677490 এর মতো বৃহত স্কোয়ারে ব্যর্থ হয়


4
এটি একটি কোডের উত্তর মাত্র। দয়া করে কিছুটা যুক্তি সরবরাহ করুন।
হটজিস্ট

আপনি কি এই @hotzst এর মাধ্যমে যুক্তির কারণ বলতে পারছেন না? এটি নিখুঁত জ্ঞান তৈরি করে এবং আমি পাইথনের বিশেষজ্ঞও নই। এটি সবচেয়ে বড় পরীক্ষা নয় তবে এটি তত্ত্ব এবং ছোট ক্ষেত্রে উভয়ই বৈধ।
কোজিটোআর্গো কোজিটোসাম

4
@ কোজিটো আরগো কোজিটোসাম: আপনি বুঝতে পারছেন না। গুগলের মতো অনুসন্ধান ইঞ্জিন ব্যবহার করে অনুসন্ধানের দ্বারা কেবল কোডের উত্তরগুলি পাওয়া যায় না। উত্তরটি যে কেউ বুঝতে পারে তা অপ্রাসঙ্গিক।
রাষ্ট্রপতি জেমস কে পোলক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.