প্রাকৃতিকভাবে লিনিয়ার ডায়োফান্তাইন সমীকরণ


13

দুটি ভেরিয়েবলের মধ্যে একটি লিনিয়ার ডায়োফান্টাইন সমীকরণ হ'ল ফর্ম ax + by = c এর সমীকরণ , যেখানে a , b এবং c ধ্রুবক পূর্ণসংখ্যা এবং x এবং y পূর্ণসংখ্যা পরিবর্তনক হয়।

অনেকগুলি প্রাকৃতিকভাবে ডায়োফানটাইন সমীকরণের জন্য, x এবং y এমন পরিমাণের প্রতিনিধিত্ব করে যা নেতিবাচক হতে পারে না।

কার্য

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা গুণাগুণকে a , b এবং c ইনপুট হিসাবে গ্রহণ করে এবং প্রাকৃতিক সংখ্যার (0, 1, 2,…) x এবং y এর এক নির্বিচারে জুটি দেয় যা সমীকরণের অক্ষটি + + সি দ্বারা যাচাই করে , যদি এমন একটি জোড় থাকে বিদ্যমান।

অতিরিক্ত বিধি

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

  • আপনি যে কোফিসিয়েন্টস অনুমান হতে পারে একটি এবং উভয় নন-জিরো হয়।

  • আপনার কোডটি অবশ্যই -2 60 এবং 2 60 এর মধ্যে কোনও সংখ্যার ট্রিপল জন্য কাজ করবে ; এটি অবশ্যই আমার মেশিনে এক মিনিটের মধ্যে শেষ করতে হবে (ইন্টেল i7-3770, 16 জিবি র‌্যাম)।

  • আপনি কোনও বিল্ট-ইন ব্যবহার করতে পারবেন না যা ডায়োফানটাইন সমীকরণগুলিকে সমাধান করে এবং এইভাবে ম্যাথমেটিকা FindInstanceবা এর মতো এই কাজটিকে তুচ্ছ করে FrobeniusSolve

  • আপনার কোডটি আচরণ করতে পারে তবে আপনি চাইলে কোনও সমাধান পাওয়া যায় না, যতক্ষণ না এটি সময় সীমা মেনে চলে এবং এর আউটপুট কোনও বৈধ সমাধানের সাথে বিভ্রান্ত হতে পারে না।

  • স্ট্যান্ডার্ড বিধি প্রযোজ্য।

উদাহরণ

  1. নীচের উদাহরণগুলি 2x + 3y = 11 সমীকরণের জন্য বৈধ I / O চিত্রিত করে , যার ঠিক দুটি বৈধ সমাধান ( (x, y) = (4,1) এবং (x, y) = (1,3) ) রয়েছে।

    Input:  2 3 11
    Output: [4 1]
    
    Input:  (11 (2,3))
    Output: [3],(1)
    
  2. 2x + 3y = 2 এর একমাত্র বৈধ সমাধানটি হ'ল জোড় (x, y) = (1,0)

  3. নীচের উদাহরণগুলি 2x + 3y = 1 সমীকরণের জন্য বৈধ I / O চিত্রিত করে , যার কোনও বৈধ সমাধান নেই

    Input:  (2 3 1)
    Output: []
    
    Input:  1 2 3
    Output: -1
    
    Input:  [[2], [3], [1]]
    Output: (2, -1)
    
  4. জন্য (A, B, C) = (1152921504606846883, -576460752303423433, 1) , সমস্ত সঠিক সমাধান (X, Y) সন্তুষ্ট যে - (X, Y) = (বাংলা ভাষায়, 271275648142787502 + একটি 135637824071393749) কিছু অ-নেগেটিভ পূর্ণসংখ্যা জন্য এন


আমি মনে করি nonnegative পূর্ণসংখ্যার উপর কিছুটা বেশি জোর দেওয়া ভাল হবে এবং দ্বিতীয় উদাহরণটির কোনও সমাধান নেই।
Sp3000

ইনপুট 1 2 3 এর বৈধ আউটপুট রয়েছে যদিও ... [1, 1]
জ্যাক আম্মো

@ জ্যাকআ্যাম্মো: দ্বিতীয় কোড ব্লকের সমস্ত উদাহরণ 2x + 3y = 1 এর সাথে সম্পর্কিত
ডেনিস

কুড়াল + বিএক্স = কেতে আমার কাছে এটি বোঝা যাচ্ছে যে সমাধানটি x> = 0 এবং y> = 0 হতে হবে। তাহলে 38 * x + 909 * y = 3 এর এমন x, y> = 0 সমাধানগুলি কে?
রোজলুপি

উত্তর:


6

পাইথ, 92 বাইট

I!%vzhK%2u?sm,ed-hd*ed/F<G2cG2@G1G+~Q,hQ_eQj9 2)J*L/vzhKtKeoSNm-VJ/RhK_*LdQsm+LdtM3/V*LhK_JQ

এটি বেশ দানব।

অনলাইনে চেষ্টা করুন: বিক্ষোভ । ইনপুট ফর্ম্যাটটি c\n[a,b]এবং আউটপুট ফর্ম্যাটটি [x,y]

কোনও পূর্ণসংখ্যার সমাধান উপস্থিত না থাকায় আমি কিছুই প্রিন্ট করব না, এবং প্রাকৃতিক পূর্ণসংখ্যার সমাধান না থাকলে আমি কেবল একটি এলোমেলো পূর্ণসংখ্যার সমাধান মুদ্রণ করব।

ব্যাখ্যা (মোটামুটি ওভারভিউ)

  1. প্রথমে আমি ax + by = gcd(a,b)বর্ধিত ইউক্লিডিয়ান অ্যালগরিদম ব্যবহার করে সমীকরণের একটি পূর্ণসংখ্যার সমাধানটি সন্ধান করব ।

  2. তারপরে একটি পূর্ণসংখ্যার সমাধান পেতে আমি সমাধানটি (আমার গুণিত aএবং bসাথে c/gcd(a,b)) সংশোধন করব ax + by = c। এটি c/gcd(a,b)পূর্ণসংখ্যা হলে এটি কাজ করে । অন্যথায় একটি সমাধানের অস্তিত্ব নেই।

  3. অন্যান্য সমস্ত পূর্ণসংখ্যা সমাধান ফর্ম আছে a(x+n*b/d) + b(y-n*a/d) = c সঙ্গে d = gcd(a,b)পূর্ণসংখ্যা জন্য n। দুটি অসমতা ব্যবহার করে x+n*b/d >= 0এবং y-n*a/d >= 0আমি 6 টি সম্ভাব্য মানগুলি নির্ধারণ করতে পারি n। আমি এগুলির 6 টির জন্য চেষ্টা করব এবং সর্বাধিক নিম্নতম সহগ সহ সমাধানটি মুদ্রণ করব।

ব্যাখ্যা (বিস্তারিত)

প্রথম পদক্ষেপটি হল সমীকরণের একটি পূর্ণসংখ্যা সমাধান অনুসন্ধান করা ax' + by' = gcd(a,b)। এটি বর্ধিত ইউক্লিডিয়ান অ্যালগরিদম ব্যবহার করে করা যেতে পারে। উইকিপিডিয়ায় এটি কীভাবে কাজ করে সে সম্পর্কে আপনি একটি ধারণা পেতে পারেন । পার্থক্যটি হ'ল, 3 টি কলাম ( r_i s_i t_i) ব্যবহার করার পরিবর্তে আমি 6 টি কলাম ( r_i-1 r_i s_i-1 s_i t_i-1 t_i) ব্যবহার করব । এইভাবে আমাকে শেষ দুটি সারি স্মৃতিতে রাখতে হবে না, কেবল সর্বশেষটি।

K%2u?sm,ed-hd*ed/F<G2cG2@G1G+~Q,hQ_eQj9 2)   implicit: Q = [a,b] (from input)
                                     j9 2    convert 9 to base 2: [1,0,0,1]
                            + Q              add to Q => [a,b,1,0,0,1]
                                             this is the initial row
   u                                     )   start with G = ^ and update G repeatedly
                                             by the following expression, until
                                             the value of G doesn't change anymore
    ?                   @G1                    if G[1] != 0:
                     cG2                         split G into parts of 2
      m                                          map the parts d to:
       ,                                           the pair 
        ed                                           d[1]
          -hd*ed/F<G2                                d[0]-d[1]*G[0]/G[1]
     s                                           unfold
                                               else:
                           G                     G (don't change it, stop criterion for u)
 %2                                          take every second element
                                             we get the list [gcd(a,b),x',y']
K                                            store this list in K
                             ~Q,hQ_eQ        afterwards change Q to [Q[0],-Q[1]] = [a,-b]
                                             This will be important for the other parts. 

এখন আমি এর সমাধান খুঁজতে চাই ax + by = c। এটি কেবল তখনই সম্ভব, যখন c mod gcd(a,b) == 0। এই সমীকরণ সন্তুষ্ট হয়, তাহলে আমি কেবল গুন x',y'সঙ্গে c/gcd(a,b)

I!%vzhK...J*L/vzhKtK   implicit: z = c in string format (from input)
  %vzhK                evaluated(z) mod K[0] (=gcd(a,b))
I!                     if not ^ than: 
             /vzhK        c/K[0]
           *L     tK      multipy ^ to each element in K[1:] (=[x',y'])
          J               and store the result in J, this is now [x,y]

আমাদের জন্য একটি পূর্ণসংখ্যা সমাধান রয়েছে ax + by = c। লক্ষ্য করুন, যে x, yবা উভয়ই নেতিবাচক হতে পারে। সুতরাং আমাদের লক্ষ্য এগুলি অ-নেতিবাচক রূপান্তর করা to

ডায়োফানটাইন সমীকরণ সম্পর্কে দুর্দান্ত জিনিসটি হ'ল, আমরা কেবলমাত্র একটি প্রাথমিক সমাধান ব্যবহার করে সমস্ত সমাধান বর্ণনা করতে পারি। যদি (x,y)কোনও সমাধান হয়, তবে অন্যান্য সমস্ত সমাধান পূর্ণসংখ্যার (x-n*b/gcd(a,b),y+n*a/gcd(a,b))জন্য ফর্মের n

অতএব আমরা খুঁজে পেতে চান n, যেখানে x-n*b/gcd(a,b) >= 0এবং y+n*a/gcd(a,b >= 0। কিছু রূপান্তরের পরে আমরা দুটি অসমতার সাথে শেষ করি n >= -x*gcd(a,b)/bএবং n >= y*gcd(a,b)/a। লক্ষ্য করুন যে অসমতার প্রতীকটি সম্ভাব্য নেতিবাচক aবা বিভাগের সাথে বিভাজনের কারণে অন্য দিকে তাকিয়ে থাকতে পারে b। আমি এটির বিষয়ে খুব বেশি চিন্তা করি না, আমি কেবলই বলে থাকি যে একটি সংখ্যা নির্দিষ্টভাবে -x*gcd(a,b)/b - 1, -x*gcd(a,b)/b, -x*gcd(a,b)/b + 1অসমতাকে সন্তুষ্ট করে 1, এবং একটি সংখ্যা অসম্পূর্ণতাকে সন্তুষ্ট করে y*gcd(a,b)/a - 1, y*gcd(a,b)/a, y*gcd(a,b)/a + 1২. এটি একটিn উভয় বৈষম্যকে সন্তুষ্ট করে 6 সংখ্যার মধ্যে একটিও করে।

তারপরে আমি (x-n*b/gcd(a,b),y+n*a/gcd(a,b))সমস্ত 6 টি সম্ভাব্য মানগুলির জন্য নতুন সমাধানগুলি গণনা করি n। এবং আমি সর্বাধিক সর্বনিম্ন মান সহ সমাধানটি মুদ্রণ করি।

eoSNm-VJ/RhK_*LdQsm+LdtM3/V*LhK_JQ
                               _J    reverse J => [y,x]
                           *LhK      multiply each value with K[0] => [y*gcd,x*gcd]
                         /V      Q   vectorized division => [y*gcd/a,-x*gcd/b]
                  m                  map each d of ^ to:
                      tM3              [-1,0,1]
                   +Ld                 add d to each ^
                 s                   unfold
                                     these are the possible values for n
    m                                map each d (actually n) of ^ to:
             *LdQ                      multiply d to Q => [a*n,-b*n]
            _                          reverse => [-b*n,a*n]
        /RhK                           divide by K[0] => [-b*n/gcd,a*n/gcd]
     -VJ                               vectorized subtraction with J
                                       => [x+b*n/gcd,y-a*n/gcd]
 oSN                                 order the solutions by their sorted order
e                                    print the last one

তাদের বাছাই করা অর্ডার জিনিস অনুসারে বাছাই করা নিম্নলিখিত পদ্ধতিতে কাজ করে। আমি উদাহরণ ব্যবহার করছি2x + 3y = 11

আমি solutions টি সমাধানের প্রত্যেককে বাছাই করি (এগুলিকে কী বলা হয়), এবং তাদের কীগুলি দ্বারা মূল সমাধানগুলি সাজান:

solutions: [1, 3], [4, 1], [7, -1], [-5, 7], [-2, 5], [1, 3]
keys:      [1, 3], [1, 4], [-1, 7], [-5, 7], [-2, 5], [1, 3]
sort by key:
solutions: [-5, 7], [-2, 5], [7, -1], [1, 3], [1, 3], [4, 1]
keys:      [-5, 7], [-2, 5], [-1, 7], [1, 3], [1, 3], [1, 4]

এটি শেষের জন্য সম্পূর্ণ অ-নেতিবাচক সমাধান বাছাই করে (যদি থাকে তবে)।


1
  • ডেনিসের মন্তব্যের পরে, যা আমার আগের ধারণাটিকে উল্টোপাল্টা করে তুলেছিল, আমাকে কোডটিকে তার শিকড় থেকে পরিবর্তন করতে হয়েছিল এবং এটি আমাকে দীর্ঘমেয়াদী ডিবাগিংয়ে নিয়েছে এবং আমাকে দ্বিগুণ এন by বাইট খরচ করতে হয়েছে: '()।

মতলব (660)

a=input('');b=input('');c=input('');if((min(a*c,b*c)>c*c)&&a*c>0&&b*c>0)||(a*c<0&&b*c<0),-1,return,end,g=abs(gcd(a,b));c=c/g;a=a/g;b=b/g;if(c~=floor(c)),-1,return,end,if(c/a==floor(c/a)&&c/a>0),e=c/a-b;if(e>0),e,a,return,else,c/a,0,return,end,end,if(c/b==floor(c/b)&&c/b>0),e=c/b-a;if(e>0),b,e,return,else,0,c/b,return,end,end,f=max(abs(a),abs(b));if f==abs(a),f=b;b=a;a=f;g=0.5;end,e=(c-b)/a;f=(c-2*b)/a;if(e<0&&f<e),-1,elseif(e<0&&f>e),for(i=abs(c*a):abs((c+1)*a)),e=(c-i*b);if(mod(e,a)==0)if(g==0.5),i,e/a;else,e/a,i,end,return,end,end,else for(i=1:abs(a)),e=(c-i*b);if(e/a<0),-1,elseif(mod(e,a)==0),if(g==0.5),i,e/a,else,e/a,i,end,return,end,end,end,-1
  • ঠিক আছে, আমি জানি যে এটি গল্ফড নয়, যেহেতু এই ধরণের ভাষাগুলি কোড দৈর্ঘ্য হ্রাসের জন্য অভিযোজিত নয়, তবে আমি নিশ্চিত করতে পারি যে সময়-জটিলতা সবচেয়ে ভাল।

ব্যাখ্যা:

  • কোডটি তিনটি আক্রমণকারীকে ক, বি, সি ইনপুট হিসাবে গ্রহণ করে, এই শেষগুলি গণনা চালিয়ে যাওয়ার আগে কয়েকটি শর্তের বশীভূত হয়:

    1- যদি (a + b> c) এবং (a, b, c> 0) কোনও সমাধান না হয়!

    2- যদি (a + b <c), (a, b, c <0) কোন সমাধান নেই!

    3- যদি (ক, খ) এর গ এর সাধারণ বিপরীত চিহ্ন থাকে: কোনও সমাধান নেই!

    4- যদি জিসিডি (ক, খ) ডসেন্ট বিভাজন সি, তবে আবার কোনও সমাধান হবে না! অন্যথায়, জিসিডি দ্বারা সমস্ত রূপগুলি ভাগ করুন।

  • এর পরে, আমাদের আরও একটি শর্ত পরীক্ষা করে দেখতে হবে, এটি পছন্দসই সমাধানের পথটি সহজ এবং সংক্ষিপ্ত করা উচিত।

    5- যদি সি বিভক্ত a বা b, সমাধান s = (x বা y) = (সি- [কুড়াল, yb]) / [বি, এ] = সি / [বি, এ] + [কুড়াল, yb] / [বি , a] = S + [ax, yb] / [b, a] যেখানে S প্রাকৃতিক তাই ax / b বা by / a এর পরে অ-নেতিবাচক প্রত্যক্ষ সমাধান যা যথাক্রমে x = b বা y = a। (লক্ষ্য করুন যে সমাধানগুলি পূর্ববর্তী স্বেচ্ছাসেবী সমাধানগুলি নেতিবাচক প্রকাশিত হওয়ার ক্ষেত্রে কেবল শূন্য মানের হতে পারে)

  • প্রোগ্রামটি এই পর্যায়ে পৌঁছে গেলে x = (c-yb) / a এর জন্য সংক্ষিপ্তসারগুলির সমাধানগুলি পরিবর্তিত হয়, একত্রিত হওয়ার জন্য ধন্যবাদ, বৃহত্তর পরিসীমাকে বিছিন্ন করার জন্য, যা নিয়মিত চক্র দ্বারা পুনরাবৃত্তিমূলকভাবে আসে। বৃহত্তম অনুসন্ধান ক্ষেত্রটি হল [xa, x + a] যেখানে a বিভাজক।

এটি চেষ্টা করুন


ইহুহ, বৃহত সংখ্যক ইস্যু, এটি ঠিক করে দেবে (অবাক
হবেন কখনই

আমি মনে করি এর বৃহত পূর্ণসংখ্যার বিষয়ে এটি এখনও ছোটখাটো বাগটি ঠিক করতে পেরেছি কেন 1152921504606846800.000000 / 576460752303423420.000000 প্রাকৃতিক সংখ্যা 2 দিয়ে বেরিয়ে আসে যদিও এই শেষ ফলাফলটি গোল হয়েছে।
Abr001am

ওহ আমি এই বাগিং বাগটি ঠিক করতে ভুলে গেছি: @ জাকুব
Abr001am

0

অ্যাক্সিয়াম, 460 বাইট

w(a,b,x,u)==(a=0=>[b,x];w(b rem a,a,u,x-u*(b quo a)))
d(a,b,k)==(o:List List INT:=[];a=0 and b=0=>(k=0=>[1,1];[]);a=0=>(k=0=>[[1,0]];k rem b=0=>[1,k quo b];[]);b=0=>(k=0=>[[0,1]];k rem a=0=>[k quo a,1];[]);r:=w(a,b,0,1);q:=k quo r.1;(y,x,u,v):=(q*(r.1-r.2*a)quo b,q*r.2,b quo r.1,a quo r.1);m:=min(80,4+abs(k)quo min(abs(a),abs(b)));l:=y quo v;x:=x+l*u;y:=y-l*v;for n in -m..m repeat(t:=x+n*u;z:=y-n*v;t>=0 and z>=0 and t*a+z*b=k=>(o:=cons([t,z],o)));sort(o))

ungolf এবং কিছু পরীক্ষা

-- input a b and k for equation a*x+b*y=k
-- result one List of List of elments [x,y] of solution of  
-- that equation with x and y NNI (not negative integers) 
-- or Void list [] for no solution
diopanto(a,b,k)==
  o:List List INT:=[]
  a=0 and b=0=>(k=0=>[1,1];[])
  a=0=>(k=0=>[[1,0]];k rem b=0=>[1,k quo b];[])
  b=0=>(k=0=>[[0,1]];k rem a=0=>[k quo a,1];[])
  r:=w(a,b,0,1)
  q:=k quo r.1
  (y,x,u,v):=(q*(r.1-r.2*a)quo b,q*r.2,b quo r.1,a quo r.1)
  m:=min(80,4+abs(k)quo min(abs(a),abs(b)))
  l:=y quo v           -- center the interval
  x:=x+l*u; y:=y-l*v
  for n in -m..m repeat
     t:=x+n*u;z:=y-n*v
     t>=0 and z>=0 and t*a+z*b=k=>(o:=cons([t,z],o))
  sort(o)

 ------------------------------------------------------
(4) -> d(0,-9,0)
   (4)  [[1,0]]
                                                  Type: List List Integer
(5) -> d(2,3,11)
   (5)  [[4,1],[1,3]]
                                                  Type: List List Integer
(6) -> d(2,3,2)
   (6)  [[1,0]]
                                                  Type: List List Integer
(7) -> d(2,3,1)
   (7)  []
                                                  Type: List List Integer
(8) -> d(1152921504606846883,-576460752303423433,1)
   (8)
   [[135637824071393749,271275648142787502],
    [712098576374817182,1424197152749634385],
    [1288559328678240615,2577118657356481268],
    [1865020080981664048,3730040161963328151],
    [2441480833285087481,4882961666570175034]]
                                                  Type: List List Integer

অন্যান্য 'সমাধানগুলির' ক্ষেত্রেও ত্রুটি ছিল কারণ এটি একটি তালিকায় অসীম সমাধানগুলি সংরক্ষণ করার চেষ্টা করেছিল; এখন এটি সর্বাধিক 80 টি সলিউশন সীমাবদ্ধ করা হয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.