কোনও গাউসিয়ান পূর্ণসংখ্যাকে ফ্যাক্টরাইজ করুন


23

একজন গসিয়ান পূর্ণসংখ্যা একটি জটিল সংখ্যা, যার বাস্তব এবং কল্পিত অংশের পূর্ণসংখ্যার হয়।

গৌসিয়ান পূর্ণসংখ্যা, সাধারণ পূর্ণসংখ্যার মতো গৌসিয়ান প্রাইমের পণ্য হিসাবে একটি অনন্য উপায়ে উপস্থাপন করা যেতে পারে। এখানে চ্যালেঞ্জটি কোনও প্রদত্ত গাউসিয়ান পূর্ণসংখ্যার মূল উপাদান গণনা করা।

ইনপুট: গাউসিয়ান পূর্ণসংখ্যা, যা 0 এর সমান হয় না এবং একক হয় না (যেমন 1, -1, i এবং -i ইনপুট হিসাবে দেওয়া যায় না)। যে কোনও বুদ্ধিমান বিন্যাস ব্যবহার করুন, উদাহরণস্বরূপ:

  • 4-5i
  • -5 * ঞ +4
  • (4, -5)

আউটপুট: গাউসিয়ান পূর্ণসংখ্যার একটি তালিকা, যা প্রধান (যেমন তাদের কোনওটিই দুটি নন-ইউনিট গাউসিয়ান পূর্ণসংখ্যার পণ্য হিসাবে প্রতিনিধিত্ব করতে পারে না), এবং যার পণ্য ইনপুট সংখ্যার সমান। আউটপুট তালিকার সমস্ত নম্বর অবশ্যই অপ্রয়োজনীয়, অর্থাত্ 1, -1, i বা -i নয়। যে কোনও বুদ্ধিমান আউটপুট ফর্ম্যাট ব্যবহার করা যেতে পারে; এটি অগত্যা ইনপুট বিন্যাসের মতো হওয়া উচিত নয়।

যদি আউটপুট তালিকার 1 টির বেশি উপাদান থাকে তবে কয়েকটি সঠিক আউটপুট সম্ভব are উদাহরণস্বরূপ, ইনপুট 9 এর জন্য আউটপুট [3, 3] বা [-3, -3] বা [3i, -3i] বা [-3i, 3i] হতে পারে।

পরীক্ষার কেস, ( এই টেবিল থেকে নেওয়া ; পরীক্ষার ক্ষেত্রে 2 লাইন)

2
1+i, 1-i

3i
3i

256
1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i

7+9i
1+i,2−i,3+2i

27+15i
1+i,3,7−2i

6840+585i
-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i

গাউসিয়ান পূর্ণসংখ্যার জন্য অন্তর্নির্মিত কার্যগুলি অনুমোদিত নয়। অন্তর্নির্মিত ফাংশনগুলি দ্বারা সাধারণ পূর্ণসংখ্যার ফ্যাক্টরিং অনুমোদিত তবে।


করা উচিত 3iহিসাবে আসতে 3,i, বা 3i?
মান কালি

3iসঠিক উত্তর কারণ iএকটি প্রধান নয়। এটি পরিষ্কার করার জন্য আমি পরীক্ষার কেস আপডেট করেছি।
অ্যানাটলিগ

-3-2j, 2-1j, -1-1j 7 + 9j এর গুণককরণের সঠিক উত্তর?
mdahmoune

4
ওল্ফ্রাম আলফার মতে, 6840+585iকারণগুলির একটি ভুল তালিকা রয়েছে, যেমন 5কোনও গাউসিয়ান প্রধানমন্ত্রী নয়। পরিবর্তে, এটি ফিরে আসে -1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+iউত্স
মান কালি

1
এফওয়াইআই, কারণ 256=(1+i)**16নয় এবং(1+i)**8256=2**8=(2i)**82i=(1+i)**2
শিয়েরু আসাকোটো

উত্তর:


4

জেলি , 61 55 বাইট

Ḟ,Ċ1ḍP
Ḟ,ĊḤp/-,1p`¤×€×1,ıFs2S€⁸÷ÇÐfỊÐḟ1;Ṫð,÷@\ḟ1
Ç€F$ÐL

এটি অনলাইন চেষ্টা করুন! (শিরোনাম এবং পাদলেখ আউটপুট ফর্ম্যাট করে)

-6 বাইটস @ এরিকআউটগলফারকে ধন্যবাদ thanks

কিভাবে এটা কাজ করে

Ḟ,Ċ1ḍP  - helper function: determines if a complex number is Gaussian
Ḟ,Ċ       - real, complex components
   1ḍ     - set each to if 1 divides them
     P    - all

Ḟ,ĊḤp/-,1p`¤×€×1,ıFs2S€⁸÷ÇÐfỊÐḟ1;Ṫð,÷@\ḟ1 - helper: outputs a factor pair of the input
Ḟ,ĊḤp/                   - creates a list of possible factors a+bi, a,b>=0
      -,1p`¤×€           - extend to the other three quadrants 
              ×1,ıFs2S€  - convert to  actual complex numbers 
⁸÷                       - get quotient with input complex number
  ÇÐf                    - keep only Gaussian numbers (using helper function)
     ỊÐḟ                 - remove units (i,-i,1,-1)
        1;               - append a 1 to deal with primes having no non-unit factors
          Ṫð,÷@\         - convert to a factor pair
                ḟ1       - remove 1s
Ç€F$ÐL
Ç€      - factor each number
   $    - and
  F     - flatten the list
    ÐL  - until factoring each number and flattening does not change the list


যখন এটি "কেবল গসিয়ান রাখুন" এর অর্থ কি "কেবল প্রাইম রাখুন"?
উজ্জ্বল ডন

@ ডনব্রাইট নং, এটি কেবলমাত্র সেই জটিল সংখ্যাগুলি পূর্ণসংখ্যার আসল এবং জটিল উপাদানগুলির সাথে রাখা বোঝায়
ফায়ার ফ্লেম ২৪১

@ ফায়ার ফ্লেম 241 ওহ আমি এখন দেখছি! আপনাকে অনেক ধন্যবাদ
উজ্জ্বল ডন

5

রুবি , 258 256 249 246 + 8 = 264 257 254 বাইট

-rprimeপতাকা ব্যবহার করে ।

গীজ, কি গোলমাল।

স্ট্যাকওভারফ্লো থেকে এই অ্যালগরিদম ব্যবহার করে।

->c{m=->x,y{x-y*eval("%d+%di"%(x/y).rect)};a=c.abs2.prime_division.flat_map{|b,e|b%4<2?(1..e).map{k=(2..d=b).find{|n|n**(~-b/2)%b==b-1}**(~-b/4)%b+1i;d,k=k,m[d,k]while k!=0;c/=d=m[c,d]==0?d:d.conj;d}:(c/=b<3?(b=1+1i)**e:b**e/=2;[b]*e)};a[0]*=c;a}

এটি অনলাইন চেষ্টা করুন!


5

পাইথন 2 , 250 239 223 215 বাইট

e,i,w=complex,int,abs
def f(*Z):
 if Z:
	z=Z[0];q=i(w(z));Q=4*q*q
	while Q>0:
 	 a=Q/q-q;b=Q%q-q;x=e(a,b)
 	 if w(x)>1:
		y=z/x
		if w(y)>1 and y==e(i(y.real),i(y.imag)):f(x,y);z=Q=0
 	 Q-=1
	if z:print z
	f(*Z[1:])

এটি অনলাইন চেষ্টা করুন!

  • একাধিক ফাংশন আর্গুমেন্ট ব্যবহার করার সময় -11 বাইট
  • দম্পতিদের পার্স করার জন্য একটি পরিবর্তনশীল ব্যবহার করার সময় -2² *। বাইট (a,b)
  • ট্যাব এবং স্পেসগুলি মিশ্রিত করার সময় -2³ বাইট: ওভিএসকে ধন্যবাদ

কিছু ব্যাখ্যা ক্রমবর্ধমানভাবে একটি জটিলটিকে দুটি কমপ্লেক্সে পঁচিয়ে দেয় যতক্ষণ না কোনও ক্ষয় সম্ভব না ...


ঠিক আছে, টিআইওতে এটি আরও বড় ইনপুটগুলি বেরিয়ে যায় তবে এটি আমার রুবির উত্তরের চেয়ে কম ... আপাতত । এছাড়াও, def f(Z,s=[])আপনার একটি অক্ষর সংরক্ষণ করা উচিত
মান কালি

@ ভ্যালিউইঙ্ক হ্যাঁ এটি আপনার রুবি সমাধানের চেয়ে ধীর
mdahmoune

2
ইন্ডেন্টেশন সহ আকর্ষণীয়
নিদর্শন

@ ভ্যালিউইঙ্ক একাধিক ফাংশন যুক্তি আরও বাইট সংরক্ষণ করে :)
এমডাহুমনে


3

মরিচা - 212 বাইট

use num::complex::Complex as C;fn f(a:&mut Vec<C<i64>>){for _ in 0..2{for x in -999..0{for y in 1..999{for i in 0..a.len(){let b=C::new(x,y);if(a[i]%b).norm_sqr()==0&&(a[i]/b).norm_sqr()>1{a[i]/=b;a.push(b)}}}}}}

এটি যদি 100% সঠিকভাবে কাজ করে তবে আমি 100% নিশ্চিত নই, তবে বড় পরিসরের পরীক্ষার জন্য এটি সঠিক বলে মনে হচ্ছে। এটি জেলির চেয়ে ছোট নয়, তবে অন্তত এটি বর্ণিত ভাষাগুলির চেয়ে ছোট (এখন পর্যন্ত) is এটিও দ্রুত বলে মনে হচ্ছে এবং এটি এক সেকেন্ডেরও কম সময়ে বিলিয়ন প্রস্থের ইনপুটগুলির মাধ্যমে কাজ করতে পারে। উদাহরণস্বরূপ 1234567890 + 3141592650i কারণগুলি (-9487 + 7990i) (- 1 + -1i) (- 395 + 336i) (2 + -1 আই) (1 + 1 আই) (3 + 0 আই) (3 + 0 আই) (4+ 1i) (- 1 + 1i) (- 1 + 2i), (ওল্ফ্রাম আলফায় পরীক্ষা করতে এখানে ক্লিক করুন)

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

এটি এখনও "(একটি মোড বি) == 0" ব্যবহার করে একটি পূর্ণসংখ্যা অন্যকে ভাগ করে দেয় কিনা তা পরীক্ষা করতে (গাউসিয়ানদের জন্য, আমরা বিল্টিন রাস্ট গাউসীয় মডুলো ব্যবহার করি এবং "0" কে আদর্শ হিসাবে বিবেচনা করি == 0) তবে 'আদর্শের জন্য পরীক্ষা করা ( a / b)! = 1 '"অত্যধিক" বিভাজন রোধ করে, মূলত ফলস্বরূপ ভেক্টরকে কেবল প্রাইমগুলিতে পূরণ করতে দেয় তবে ভেক্টরের কোনও উপাদানকে unityক্যে নামায় না (0-i, 0 + i, -1 + 0 আই, 1 + 0 আই) (যা প্রশ্ন দ্বারা নিষিদ্ধ)।

পরীক্ষার মাধ্যমে লুপ সীমাটি পাওয়া গেছে। ডিভাইড-বাই-শূন্য আতঙ্ক রোধ করতে y প্রথম থেকে উপরে চলে গেছে, এবং এক্স -৯৯৯ থেকে ০ পর্যন্ত গৌড়ীয়দের চতুর্ভুজগুলির উপর মিররিংয়ের জন্য ধন্যবাদ জানাতে পারে (আমার মনে হয়?) সীমাবদ্ধতাগুলি সম্পর্কে, মূল প্রশ্নটি ইনপুট / আউটপুটটির একটি বৈধ পরিসীমা নির্দেশ করে না, সুতরাং একটি "যুক্তিসঙ্গত ইনপুট আকার" ধরে নেওয়া হয় ... (সম্পাদনা ... তবে আমি কোন সংখ্যায় এটি নির্ধারণ করব তা নিশ্চিতভাবে নিশ্চিত নই "ব্যর্থ" হতে শুরু করুন, আমি কল্পনা করেছি যে গাউসিয়ান পূর্ণসংখ্যা রয়েছে যা 999 এর নীচে কোনও কিছু দ্বারা বিভাজ্য নয় তবে এখনও আমার কাছে আশ্চর্যরকম ছোট)

Play.rust-lang.org এ কিছুটা অদম্য সংস্করণ ব্যবহার করে দেখুন


3

পার্ল 6 , 141 124 বাইট

জো কিংকে -17 বাইটের জন্য ধন্যবাদ

sub f($_){{$!=0+|sqrt .abs²-$^a²;{($!=$_/my \w=$^b+$a*i)==$!.floor&&.abs>w.abs>1>return f w&$!}for -$!..$!}for ^.abs;.say}

এটি অনলাইন চেষ্টা করুন!


কিভাবে কাজ করে? মেঝে একটি কাস্টম নির্মিত মডুলো হয়?
উজ্জ্বল

1
@ ডনব্রাইট floorঅংশটি পরীক্ষা করছে $_/w( যদি কোনও সংখ্যার দ্বারা বিভক্ত বর্তমান ফ্যাক্টর) একটি সম্পূর্ণ সংখ্যা কিনা
জো কিং

2

পাইথ , 54 51 45 42 36 বাইট

 .W>H1cZ
h+.aDf!%cZT1>#1.jM^s_BM.aZ2

এটি অনলাইন চেষ্টা করুন!

ফর্মটিতে ইনপুট গ্রহণ করে 1+2j- খাঁটি আসল বা কাল্পনিক সংখ্যাগুলি অন্য উপাদানটিকে (যেমন 9, 2j) বাদ দিতে পারে । আউটপুট জটিল সংখ্যার একটি নিউলাইন-বিচ্ছিন্ন তালিকা যা ফর্মটিতে (1+2j)খাঁটি কল্পিত সংখ্যার সাথে আসল অংশ বাদ দেয়।

এটি সরল ট্রেইল বিভাগ ব্যবহার করে, 1 টির চেয়ে বেশি এবং বর্তমান মানের চেয়ে কম মানের সাথে সমস্ত গাউসিয়ান পূর্ণসংখ্যা তৈরি করে plus এগুলি ফিল্টার করা হয় যা মানগুলির একটি ফ্যাক্টর, এবং আকারের দ্বারা ক্ষুদ্রতমটি পরবর্তী প্রধান উপাদান হিসাবে নির্বাচিত হয়। এটি আউটপুট, এবং পরবর্তীটি পুনরাবৃত্তির জন্য মান উত্পাদন করতে মানটি এটি দ্বারা ভাগ করা হয়।

এছাড়াও, পাইথ জেলিকে মারধর করে (যদিও আমি এটি টেকার আশা করি না)

 .W>H1cZ¶h+.aDf!%cZT1>#1.jM^s_BM.aZ2ZQ   Implicit: Q=eval(input())
                                         Newline replaced with ¶, trailing ZQ inferred
 .W                                  Q   While <condition>, execute <inner>, with starting value Q
   >H1                                   Condition function, input H
   >H1                                     Is magnitude of H > 1?
                                           This ensures loop continues until H is a unit, i.e. 1, -1, j, or -j)
      cZ¶h+.aDf!%cZT1>#1.jM^s_BM.aZ2Z    Inner function, input Z
                                .aZ        Take magnitude of Z

                             _BM           Pair each number in 0-indexed range with its negation
                            s              Flatten
                           ^       2       Cartesian product of the above with itself
                        .jM                Convert each pair to a complex number
                      #                    Filter the above to keep those element where...
                     > 1                   ... the magnitude is greater than 1 (removes units)
              f                            Filter the above, as T, to keep where:
                 cZT                         Divide Z by T
                %   1                        Mod real and imaginary parts by 1 separately
                                             If result of division is a gaussian integer, the mod will give (0+0j)
               !                             Logical NOT - maps (0+0j) to true, all else to false
                                           Result of filter are those gaussian integers which evenly divide Z
           .aD                             Sort the above by their magnitudes
          +                         Z      Append Z - if Z is ±1±1j, the filtered list will be empty
         h                                 Take first element, i.e. smallest factor
        ¶                                  Print with a newline
      cZ                                   Divide Z by that factor - this is new input for next iteration
                                         Output of the while loop is always 1 (or -1, j, or -j) - leading space suppesses output

এটি খুব আকর্ষণীয় তবে এটি 6840 + 585j এ সময়সীমা দেখা দেয়
উজ্জ্বল ডন

@ ডনব্রাইট টিআইও-তে এটি করে, কারণ এটির প্রসেসিং সীমা 60s। এটি আরও সময় নিয়ে কাজ করবে, সুতরাং আপনি যদি স্থানীয়ভাবে এটি চালাচ্ছেন তবে এটি কোনও সমস্যা ছাড়াই কাজ করা উচিত।
সোক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.