2015-08-28 8 views
6

गणित सिद्धांत से की राशि के रूप में लिखा जा सकता है:संख्या जो दो वर्गों

अनेक एन 2 वर्गों की राशि के रूप में व्यक्त तभी एन के प्रधानमंत्री गुणन, के हर प्रधानमंत्री में अगर फॉर्म (4k+3) कई बार होता है!

मैंने जो किया वह सभी 4k+3 संख्याओं की पूर्व-गणना की जाती है और निरंतर विभाजन द्वारा इसकी आवृत्ति की जांच की जाती है।

इस कार्यक्रम की कमी के पत्राचार में लिखा है:

1 < T <100 
0 < N < 10^12 

import java.util.Scanner; 

public class TwoSquaresOrNot { 
    static int max = 250000; 
    static long[] nums = new long[max]; 

    public static void main(String args[]) { 
     Scanner sc = new Scanner(System.in); 
     int T = sc.nextInt(); 
     for (int i = 0; i < max; ++i) 
      nums[i] = 4 * i + 3; 
     while (T-- > 0) { 
      long n = sc.nextLong(); 
      System.out.println((canWrite(n) ? "Yes" : "No")); 
     } 
    } 

    private static boolean canWrite(long n) { 
     // TODO Auto-generated method stub 
     for (int i = 0; i < nums.length; ++i) {//loop through all the numbers 
      if (nums[i] > n) 
       return true; 
      int count = 0; 
      while (n % nums[i] == 0) { 
       count++; 
       n /= nums[i]; 
      } 
      if (count % 2 != 0)//check for odd frequency 
       return false; 
     } 
     return true; 
    } 
} 

लेकिन इस SPOJ वेबसाइट में काम करने के लिए प्रतीत नहीं होता।

क्या मुझे कुछ याद आ रही है? या मुझ से कुछ गलत हो रहा है?

0 इस पर भी विचार किया जाता है।

Some valid cases are: 

1 = 1^2 + 0^2 
8 = 2^2 + 2^2 
+0

मैं अपने कोड का परीक्षण नहीं किया था, लेकिन आप मध्यवर्ती 'System.out.print' दूर करने की कोशिश कर सकते हैं:

तो अपने कोड की तरह कुछ बन जाना चाहिए। यह वेबसाइट को प्रभावित कर सकता है। – Tunaki

+0

अहह! धन्यवाद। मैंने उसे नहीं देखा। हालांकि गलत जवाब। –

+0

क्या "0" वर्ग के रूप में गिनती है? यदि नहीं, 9 एक मामूली counterexample है। –

उत्तर

2

ओपी की टिप्पणियों के अनुसार संपादित किया गया।

युगल चीजें। सबसे पहले: यदि आप प्राइम कारकराइजेशन की तलाश में हैं, तो आप> sqrt (n) पर रुक सकते हैं, आपको एन के लिए सभी तरह से जाना नहीं है।

private static boolean canWrite(long n) { 
    // TODO Auto-generated method stub 
    for (int i = 0; i < nums.length; ++i) {//loop through all the numbers 
     //FIRST CHANGE: Sqrt 
     if (nums[i] > Math.sqrt(n)) 
      break; 
     int count = 0; 
     while (n % nums[i] == 0) { 
      //SECOND CHANGE: count as an array 
      count[i]++; 
      n /= nums[i]; 
     } 
    } 
    //SECOND CHANGE: count as an array 
    for (int i=0; i<count.length; i++) { 
     if (count[i] %2 != 0) return false; 
    } 
    return true; 
} 
+0

मैं वास्तव में वर्ग-रूट एन दृष्टिकोण की सराहना करता हूं। हालांकि यह इस दृष्टिकोण के लिए समय नहीं दे रहा था। मैं भी उस पर विचार करूंगा। 'IsPrime()' की दूसरी चीज़ की जांच समय की बर्बादी है। यदि यह एक प्रमुख नहीं है तो इसमें गुणक नहीं होंगे क्योंकि पिछली प्राइम इन ('3' और' 5' '15' गुणों को हटा दें) को हटा दें। यह सिर्फ थोड़ा ऊपर है। तीसरी बात, आपको गलत तरीके से बयान मिला। यह बताता है कि यहां तक ​​कि यदि संख्याओं में से एक को '4k + 3' के रूप में लिखा जा सकता है, तो अजीब आवृत्ति है, तो इसे [2 वर्गों के योग] के रूप में प्रदर्शित नहीं किया जा सकता है (https://www.math.hmc.edu/funfacts /ffiles/20008.5.shtml)। धन्यवाद। –

+0

मुख्य रूप से 250000 विशाल संख्याओं के लिए जांच करना एक अच्छा विचार नहीं है। क्योंकि इसके कारक पहले के प्राइम से समाप्त हो जाएंगे। इस प्रकार नियंत्रण लूप में नहीं मिलेगा। बाकी आत्म व्याख्यात्मक है –

संबंधित मुद्दे