ফার্মের ফ্যাক্টেরাইজেশন সহায়ক


19

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

কাজটি

একটি সেমিপ্রাইম এন এবং ধনাত্মক পূর্ণসংখ্যার , আমরা এক্স এবং Y হিসাবে সংজ্ঞা দিই :

y=x2-কেএন

এক্স=এন
Y=এক্স2-এন

পদক্ষেপ # 1 - কে খুঁজুন

আপনাকে প্রথমে কে এর সবচেয়ে ছোট সম্ভাব্য মান খুঁজে বার করতে হবে যেমন Y একটি বর্গ সংখ্যা ( ওরফে নিখুঁত বর্গ)।

এটি ফার্মের ফ্যাক্টরিজেশন পদ্ধতিরএন একক পুনরাবৃত্তির সাথে কেএনকে ফ্যাক্টরাইজ করতে দেয় । আরও দৃ concrete়ভাবে, এটি অবিলম্বে বাড়ে:

এন=(এক্স+ +Y)×(এক্স-Y)

(আপডেট: এই ক্রমটি এখন A316780 হিসাবে প্রকাশিত হয়েছে )

পদক্ষেপ # 2 - ফ্যাক্টরিজ

এর পরে আপনি দুই ধনাত্মক পূর্ণসংখ্যা খুঁজে বের করতে হবে তোমার দর্শন লগ করা এবং বনাম যেমন যে:

c u = x +

তোমার দর্শন লগ করাবনাম=
dv=x-
তোমার দর্শন লগ করা=এক্স+ +Y
বনাম=এক্স-Y

যেখানে এবং ডি এন এর প্রধান কারণ ।এন

সারসংক্ষেপ

আপনার টাস্কটি এমন একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা এন ইনপুট হিসাবে গ্রহণ করে এবং কোনও অর্ডার এবং কোনও যুক্তিসঙ্গত বিন্যাসে তোমার দর্শন লগ করা এবং ভি প্রিন্ট করে অথবা আউটপুট দেয় বনাম

উদাহরণ

আসুন এন = 199163 বিবেচনা করুনএন=199163

ধাপ 1

ক্ষুদ্রতম সম্ভব মান হয় 40 যা দেয়:

y=28232-40×199163=7969329-7966520=2809=532কেএন=(2823+53)×(2823-53)কেএন=2876×2770

এক্স=(40×199163)=2823
Y=28232-40×199163=7969329-7966520=2809=532
এন=(2823+ +53)×(2823-53)
এন=2876×2770

ধাপ ২

সঠিক গুণকনির্ণয় হয় =4×10 কারণ:

এন=2876×2770
এন=(719×4)×(277×10)
এন=719×277

সুতরাং, সঠিক উত্তরটি হয় বা ।[4,10][10,4]

বিধি

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

পরীক্ষার মামলা

N          | k    | Output
-----------+------+------------
143        | 1    | [   1,  1 ]
2519       | 19   | [   1, 19 ]
199163     | 40   | [   4, 10 ]
660713     | 1    | [   1,  1 ]
4690243    | 45   | [   9,  5 ]
11755703   | 80   | [  40,  2 ]
35021027   | 287  | [   7, 41 ]
75450611   | 429  | [ 143,  3 ]
806373439  | 176  | [   8, 22 ]
1355814601 | 561  | [  17, 33 ]
3626291857 | 77   | [   7, 11 ]
6149223463 | 255  | [  17, 15 ]
6330897721 | 3256 | [  74, 44 ]

উদাহরণ বাস্তবায়ন

নীচের স্নিপেটে, ফাংশনটি একটি নিখরচায় বাস্তবায়ন যা কে ইনপুট হিসাবে গ্রহণ করে এবং এবং ।এনতোমার দর্শন লগ করাবনাম

কেবল উদাহরণস্বরূপ উদ্দেশ্যে, স্নিপেটে ফাংশন অন্তর্ভুক্ত রয়েছে যা , এবং কে ইনপুট হিসাবে গ্রহণ করে এবং এর গুণকগুলি গণনা করে ।এনতোমার দর্শন লগ করাবনামএনহে(1)


আমরা কি গ্যারান্টিযুক্ত যে ইনপুটটি Nআসলে অর্ধপরিম হবে?
গ্রেগ মার্টিন

@ গ্রেগমার্টিন হ্যাঁ আপনি আছেন।
আর্নৌল্ড

উত্তর:


8

গণিত, 81 79 বাইট

2 বাইট সংরক্ষণের জন্য মার্টিন ইন্ডারকে ধন্যবাদ!

(c=Ceiling;For[j=0;z=E,c@z>z,p=(x=c@Sqrt[j+=#])+{z=Sqrt[x^2-j],-z}];p/#~GCD~p)&

খাঁটি ফাংশন ইনপুট হিসাবে একটি সেমিপ্রাইম গ্রহণ এবং ইতিবাচক পূর্ণসংখ্যার একটি অর্ডারযুক্ত জোড় ফেরত। Forলুপ কার্যকরী যথাযথ পদ্ধতিটি প্রশ্নে বর্ণিত (ব্যবহার #স্থানে ইনপুট জন্য nসঙ্গে), xসেখানে সংজ্ঞায়িত, যদিও আমরা সঞ্চয় j = k*nপরিবর্তে kনিজেই এবং z=Sqrt[y]পরিবর্তে yনিজেই। আমরা লুপটির p={x+z,x-z}অভ্যন্তরেও গণনা করি Forযা একটি বাইট সংরক্ষণ করে শেষ হয় (সপ্তম চেষ্টাটির মতো)। তারপর দুই আকাঙ্ক্ষিত কারণ (x+z)/GCD[#,x+z]এবং (x-z)/GCD[#,x-z]যা সংক্ষিপ্ত অভিব্যক্তি p/#~GCD~pএকটি আদেশ জুড়ি হিসাবে সরাসরি নির্ণয় করে।

কৌতূহল: আমরা zপূর্ণসংখ্যার অবধি লুপ করতে চাই ; কিন্তু আমরা ব্যবহার করতে যাচ্ছেন যেহেতু Ceilingকোডে ইতিমধ্যে এটিকে দুটি বাইট ওভার সংরক্ষণ !IntegerQ@zসংজ্ঞায়িত করতে c=Ceiling(যা চার বাইট খরচ, যেমন ম্যাথামেটিকাল গলফার জানেন) এবং তারপর পরীক্ষা কিনা c@z>z। আমাদের zকোনও কিছুর সূচনা করতে হবে এবং লুপটি শুরু করতে পারে তার জন্য কোনও পূর্ণসংখ্যা না হওয়া ভাল ছিল; ভাগ্যক্রমে, Eএকটি সংক্ষিপ্ত পছন্দ।


4

জাভাস্ক্রিপ্ট (ES7), 86 81 বাইট

n=>(g=k=>(y=(n*k)**.5+1|0,y+=(y*y-n*k)**.5)%1?g(k+1):n*u++%y?g(k):[--u,k/u])(u=1)

সম্পাদনা করুন: @ আরনল্ডকে ধন্যবাদ 4 টি বাইট সংরক্ষণ করা হয়েছে


4

পাইথন 2, 127 121 117 111 107 104 101 99 বাইট

-1 বাইট ধন্যবাদ নীল এবং -3 বাইটকে ওভিএসকে ধন্যবাদ

N=input()
k=u=1;p=m=.5
while p%1:p=1+(k*N)**m//1;p+=(p*p-k*N)**m;k+=1
while N*u%p:u+=1
print~-k/u,u

অনলাইনে চেষ্টা করে দেখুন!

curiosities:

p.5লুপ শর্তটি প্রথম পুনরাবৃত্তির ক্ষেত্রে সত্য হয়ে উঠতে পারে তাই এটির সূচনা করা হয় । মনে রাখবেন যে এটি প্রতিটি এবং পৃথকভাবে সঞ্চয় করার চেয়ে স্টোর করা p(যেমন x+ sqrt(y)) খাটো ।xy


x*xএর বদলে x**2?
নীল

@ নীল হ্যাঁ, অবশ্যই ধন্যবাদ
গণিত জাঙ্কি

1

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

v(x)==floor(x^.5)::INT;r(n)==(k:=0;repeat(k:=k+1;x:=1+v(k*n);y:=v(x*x-k*n);x^2-y^2=k*n=>break);[w:=gcd(k,x+y),k/w])

প্রশ্নটি সমাধান করবে এমন ফাংশনটি হল উপরের (এন)। ungolf এবং পরীক্ষা

vv(x)==floor(x^.5)::INT    

--(x-y)*(x+y)=k*n
rr(n)==
  k:=0
  repeat
     k:=k+1
     x:=1+vv(k*n)
     y:=vv(x*x-k*n)
     x^2-y^2=k*n=>break
  [w:=gcd(k,x+y),k/w]


(4) -> [[i,r(i)] for i in [143,2519,199163,660713,4690243,11755703]]
   (4)
   [[143,[1,1]], [2519,[1,19]], [199163,[4,10]], [660713,[1,1]],
    [4690243,[9,5]], [11755703,[40,2]]]
                                                      Type: List List Any
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.