2017-10-16 20 views
8

यह विधि Long में ले जाएगी और विधि को पारित किए गए किसी भी अंक के लिए प्राइम संख्याओं के LongStream लौटाएगी।एक विधि के साथ कार्यात्मक जावा धाराओं में प्रमुख कारक प्राप्त करना?

factors.java

public LongStream factors(long x){ 
    LongStream factorStream = LongStream.range(1, x+1).filter(n -> x%n == 0); 
    return factorStream; 
} 

उपरोक्त विधि का उपयोग आम कारण खोजने के लिए पहले ठीक है।

primeFactors.java

public LongStream primeFactors(long x){ 
    LongStream primeFactorStream = factors(x).filter(n -> factors(n).count() == 0); 
    //doesn't work as factors.java returns a LongStream, which might include non-prime factors, which will not equate to zero. 
    return primeFactorStream; 
} 

मैं समझता हूँ कि यह आसानी से एक सरल isPrime() विधेय के साथ विधि के उपयोग के साथ उन्हें धोखा दिया जाना चाहिए, लेकिन वहाँ के लिए एक ही बात करने के लिए एक रास्ता है के लिए प्रमुख कारक लेकिन केवल एक ही विधि के साथ?

उत्तर

3

आप की सहायता के बिना एक भी विधि में यह करने के लिए चाहते हैं, तो एक मौजूदा परीक्षण के लिए प्रधानमंत्री विधि, आप की तरह

public static LongStream primeFactors(long x) { 
    return LongStream.rangeClosed(2, x) 
        .filter(n -> x % n == 0) 
        .filter(n -> LongStream.rangeClosed(2, n/2).noneMatch(i -> n%i==0)); 
} 

यह कर सकते हैं आप

IntStream.concat(IntStream.rangeClosed(2, 15), IntStream.rangeClosed(90, 110)) 
     .forEach(number -> System.out.printf("%3d = %s%n", number, 
      primeFactors(number) 
       .mapToObj(d -> { 
        int p = 0; 
        for(long l = number; l%d == 0; l /= d, p++) l++; 
        return p == 1? String.valueOf(d): d + "^" + p; 
       }) 
       .collect(Collectors.joining(" * "))) 
     ); 
} 
की तरह विधि का परीक्षण कर सकते
2 = 2 
    3 = 3 
    4 = 2^2 
    5 = 5 
    6 = 2 * 3 
    7 = 7 
    8 = 2^3 
    9 = 3^2 
10 = 2 * 5 
11 = 11 
12 = 2^2 * 3 
13 = 13 
14 = 2 * 7 
15 = 3 * 5 
90 = 2 * 3^2 * 5 
91 = 7 * 13 
92 = 2^2 * 23 
93 = 3 * 31 
94 = 2 * 47 
95 = 5 * 19 
96 = 2^5 * 3 
97 = 97 
98 = 2 * 7^2 
99 = 3^2 * 11 
100 = 2^2 * 5^2 
101 = 101 
102 = 2 * 3 * 17 
103 = 103 
104 = 2^3 * 13 
105 = 3 * 5 * 7 
106 = 2 * 53 
107 = 107 
108 = 2^2 * 3^3 
109 = 109 
110 = 2 * 5 * 11 

कहने के लिए, यह सबसे कुशल तरीका नहीं है ...

2

आपको यह देखना होगा BigInteger के isProbablePrime() विधि का उपयोग कर सकता है, तो अपने कारकों प्रधानमंत्री हैं:

public static LongStream primeFactors(long x){ 
    LongStream primeFactorStream = factors(x) 
      .filter(n -> new BigInteger(String.valueOf(n)).isProbablePrime(10)); 
    return primeFactorStream; 
} 

primeFactors(26).forEach(System.out::println); के लिए यह रिटर्न 2 13

+1

आप BigInteger.valueOf (एन) का उपयोग करके तार से बच सकते हैं जरूरत नहीं –

+0

@SchiduLuca दिलचस्प, आपके पिछले 3 उत्तरों primes के बारे में हैं :) यह नहीं है कि 'isProbablePrime', अच्छी तरह से एक * संभावित * प्रधान? – Eugene

+0

@Eugene पिछली बार जब मैंने 'निश्चितता 'पैरामीटर के साथ गड़बड़ की। यदि आप '' 10'' डालते हैं तो यह आपको '99.99'' संभाव्यता देगा) –

2

बिना Memoization, और LongStream का उपयोग कर आप एक्स/2 अप करने के लिए रूढ़ अंक की एक धारा का निर्माण करने वाले कारकों में से स्ट्रीम के लिए की तरह कुछ सरल प्रदर्शन में सुधार लागू हो सकते हैं:

public static LongStream factors(long x){ 
    return LongStream.rangeClosed(2, x/2).filter(n -> x % n == 0); 
} 

public static LongStream primeFactors(long x){ 
    return LongStream.rangeClosed(2, x/2) 
    .filter(n -> x % n == 0).filter(n -> factors(n).count() == 0); 
} 

कौन सा के लिए बहुत बड़ी x कोई फर्क नहीं पड़ता। हालांकि यह समाधान x % n == 0 के प्रत्येक 2 स्ट्रीम में प्रत्येक एन के लिए परीक्षण को दोहराता है, जो ज्ञापन के लिए begs।

+0

यह 1 विधि का उपयोग करने की आवश्यकता को कैसे पूरा करता है? – user1803551

+2

आप किस आधार पर मानते हैं कि प्रमुख कारक उनके वर्ग रूट से बड़े नहीं हो सकते हैं? – Holger

+0

@ होल्गर और हल्क - मैं सही खड़ा हूं और समाधान भी करता है। धन्यवाद! – diginoise

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