Commit 3e231c2474f7d31835dcd115a13190cfc5ba771f
1 parent
1e6d133f
Alternative reduce with specifiable precision
Showing
2 changed files
with
40 additions
and
2 deletions
| ... | ... | @@ -49,6 +49,22 @@ impl Continuous { |
| 49 | 49 | inner(&mut v, x, a0, 0, 1, a0); |
| 50 | 50 | Continuous(v) |
| 51 | 51 | } |
| 52 | + | |
| 53 | + pub fn into_prec(&self, prec :usize) -> Fractional { | |
| 54 | + let Continuous(c) = self; | |
| 55 | + let p = if prec <= c.len() { prec } else { c.len() }; | |
| 56 | + | |
| 57 | + let to_frac = |acc :Fractional, x :&i64| { | |
| 58 | + let Fractional(an, ad) = acc.noreduce_add((*x).into()); | |
| 59 | + Fractional(ad, an) | |
| 60 | + }; | |
| 61 | + | |
| 62 | + let Fractional(n, d) = c[..p] | |
| 63 | + . into_iter() | |
| 64 | + . rev() | |
| 65 | + . fold(Fractional(0, 1), to_frac); | |
| 66 | + Fractional(d, n) | |
| 67 | + } | |
| 52 | 68 | } |
| 53 | 69 | |
| 54 | 70 | impl From<&Fractional> for Continuous { |
| ... | ... | @@ -57,11 +73,12 @@ impl From<&Fractional> for Continuous { |
| 57 | 73 | fn inner(mut v :Vec<i64>, f :Fractional) -> Vec<i64> { |
| 58 | 74 | let Fractional(n, d) = f; |
| 59 | 75 | let a = n / d; |
| 60 | - let Fractional(_n, _d) = f - a.into(); | |
| 76 | + let Fractional(_n, _d) = f.noreduce_sub(a.into()); | |
| 61 | 77 | |
| 62 | 78 | v.push(a); |
| 63 | 79 | match _n { |
| 64 | 80 | 1 => { v.push(_d); v }, |
| 81 | + 0 => v, | |
| 65 | 82 | _ => inner(v, Fractional(_d, _n)), |
| 66 | 83 | } |
| 67 | 84 | } | ... | ... |
| ... | ... | @@ -28,6 +28,8 @@ use std::fmt::{Formatter, Display}; |
| 28 | 28 | use std::num::TryFromIntError; |
| 29 | 29 | use std::ops::{Add,Sub,Neg,Mul,Div}; |
| 30 | 30 | |
| 31 | +use crate::continuous::Continuous; | |
| 32 | + | |
| 31 | 33 | #[derive(Debug, Eq, Clone, Copy)] |
| 32 | 34 | pub struct Fractional (pub i64, pub i64); |
| 33 | 35 | |
| ... | ... | @@ -67,9 +69,28 @@ impl Fractional { |
| 67 | 69 | Self(1, _n / _d) |
| 68 | 70 | } |
| 69 | 71 | } else { |
| 70 | - Self(n / hcf(n, d), d / hcf(n, d)) | |
| 72 | + //Self(n / hcf(n, d), d / hcf(n, d)) | |
| 73 | + let regular_reduced = self; | |
| 74 | + let cont :Continuous = (®ular_reduced).into(); | |
| 75 | + cont.into_prec(5) | |
| 71 | 76 | } |
| 72 | 77 | } |
| 78 | + | |
| 79 | + pub fn noreduce_add(self, other: Self) -> Self { | |
| 80 | + let Fractional(n1, d1) = self; | |
| 81 | + let Fractional(n2, d2) = other; | |
| 82 | + let n = n1 * (self.gcd(other) / d1) + n2 * (self.gcd(other) / d2); | |
| 83 | + Self(n, self.gcd(other)) | |
| 84 | + } | |
| 85 | + | |
| 86 | + pub fn noreduce_sub(self, other: Self) -> Self { | |
| 87 | + self.noreduce_add(other.noreduce_neg()) | |
| 88 | + } | |
| 89 | + | |
| 90 | + pub fn noreduce_neg(self) -> Self { | |
| 91 | + let Fractional(n, d) = self; | |
| 92 | + Self(-n, d) | |
| 93 | + } | |
| 73 | 94 | } |
| 74 | 95 | |
| 75 | 96 | impl From<i64> for Fractional { | ... | ... |
Please
register
or
login
to post a comment